Keil Logo Arm Logo


Information in this article applies to:

  • C251 Version 3.20
  • C51 Version 6.20


I would like to address the low or high byte of an int variable. Is there a way to access this directly in the C language?

Other compilers offer me macro or intrinsic functions do to that. Why is there no such function in Keil C51?


The C Language allows you to directly access the low or high bytes of an int/unsigned int variable. The Keil C51 Compiler is an optimizing compiler that generates very efficient code for such constructs. Therefore, there is no need for special intrinsic functions.

Following are two solutions to your problem.

The following example uses shift operations to perform byte accesses. This is Standard ANSI C and it may be easily ported to any other microcontroller plattfrom regardless of the byte order (little endian or big endian) in the target hardware.

#define LOWBYTE(v)   ((unsigned char) (v))
#define HIGHBYTE(v)  ((unsigned char) (((unsigned int) (v)) >> 8))

unsigned int  x;
unsigned char cl, ch;

void test (void)  {
  cl = LOWBYTE(x);
  ch = HIGHBYTE(x);

The previous example only handles read accesses. If you need write accesses at the byte level, you may use the following pointer definitions. The following example is written for architectures with big endian byte order (like the 8051) and must be adjusted to run on little endian architectures.

#define BYTELOW(v)   (*(((unsigned char *) (&v) + 1)))
#define BYTEHIGH(v)  (*((unsigned char *) (&v)))

void test1 (void)  {
  BYTEHIGH (x) = 5;

Both program examples generate code that is comparable to assembler programming techniques.



The following Discussion Forum threads may provide information related to this topic.

Last Reviewed: Friday, February 15, 2002

Did this article provide the answer you needed?
Not Sure

Keil logo

Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

ARM’s Privacy Policy has been updated. By continuing to use our site, you consent to ARM’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.

Acquisition of ARM Holdings plc. by SoftBank Group Corp.

We are pleased to inform you that on 5 September 2016, SoftBank Group Corp. acquired ARM Holdings Plc. ARM will continue to operate as an independent business within the SoftBank group.

Any current agreements between ARM Ltd (or other ARM group companies, as applicable) you / your company remain in effect as between the parties, and the parties will continue to be bound by and perform the obligations in such agreements. If you have any queries please direct these to