Bit shifting a byte by more than 8 bit

对着背影说爱祢 提交于 2019-11-29 11:12:46

In that arithmetic context byteArray[0] is promoted to either int or unsigned int, so the shift is legal and maybe even sensible (I like to deal only with unsigned types when doing bitwise stuff).

6.5.7 Bitwise shift operators

The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand.

And integer promotions:

6.3.1.1

If an int can represent all values of the original type the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.

The unsigned char's are implicitly cast to int's when shifting. Not sure to what type exactly it is cast, I thing that depends on the platform and the compiler. To get what you intend, it is safer to explicitly cast the bytes, that also makes it more portable and the reader immediately sees what you intend to do:

unsigned long int anotherLongInt;

anotherLongInt = ( ((unsigned long)byteArray[0] << 24) 
               + ((unsigned long)byteArray[1] << 16) 
               + ((unsigned long)byteArray[2] << 8) 
               + ((unsigned long)byteArray[3] ) );
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!