在here 从字节缓冲区转换回unsigned long int:
时 unsigned long int anotherLongInt;
anotherLongInt = ( (byteArray[0] << 24)
+ (byteArray[1] << 16)
+ (byteArray[2] << 8)
+ (byteArray[3] ) );
其中byteArray声明为unsigned char byteArray[4];
问题:
我认为byteArray[1]
只是一个无符号字符(8位)。当左移16时,不会将所有有意义的位移出并用0填充整个字节吗?显然它不是8位。也许它正在移动整个byteArray,这是一个连续的4字节?但我不知道它是如何运作的。
答案 0 :(得分:8)
在该算术上下文 byteArray[0]
被提升到int
或unsigned int
,所以这种转变是合法的,甚至可能是明智的(我只想处理在做按位时使用unsigned
类型。)
6.5.7按位移位运算符
对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。
整数促销:
6.3.1.1
如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int。这些被称为整数促销。
答案 1 :(得分:2)
unsigned char在移位时被隐式转换为int。不确定它是什么类型的演员,我的东西取决于平台和编译器。为了得到你想要的东西,显式地转换字节会更安全,这也使它更具可移植性,读者会立即看到你打算做的事情:
unsigned long int anotherLongInt;
anotherLongInt = ( ((unsigned long)byteArray[0] << 24)
+ ((unsigned long)byteArray[1] << 16)
+ ((unsigned long)byteArray[2] << 8)
+ ((unsigned long)byteArray[3] ) );