##
8.1.12 Higher Order Byte / Higher Order Word

It is also frequently required to obtain a higher order byte or word of a larger integral type (long, int or short types). For mcs51, SDCC recognizes the following expressions to yield the higher order byte or word and generates optimized code for it, e.g.:

> unsigned int gint;
> unsigned long int glong;
> foo () {
> unsigned char hob1, hob2;
> unsigned int how1, how2;
> ...
> hob1 = (gint » 8) & 0xFF;
> hob2 = glong » 24;
> how1 = (glong » 16) & 0xFFFF;
> how2 = glong » 8;
> ...
> }

will generate the following code:

> 91 ; hob.c 15
> 0037 85*01*06 92 mov _foo_hob1_1_1,(_gint + 1)
> 93 ; hob.c 16
> 003A 85*05*07 94 mov _foo_hob2_1_1,(_glong + 3)
> 95 ; hob.c 17
> 003D 85*04*08 96 mov _foo_how1_1_1,(_glong + 2)
> 0040 85*05*09 97 mov (_foo_how1_1_1 + 1),(_glong + 3)
> 0043 85*03*0A 98 mov _foo_how2_1_1,(_glong + 1)
> 0046 85*04*0B 99 mov (_foo_how2_1_1 + 1),(_glong + 2)

Again, variations of these cases may not be recognized. They are standard C expressions, so I heartily recommend these be the only way to get the higher order byte/word, (it is portable). Of course it will be recognized even if it is embedded in other expressions, e.g.:

> xyz = gint + ((gint » 8) & 0xFF);

will still be recognized.