将一个字节移位超过8位

在这里从字节缓冲区转换回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字节? 但我不知道它是如何工作的。

在该算术上下文中, byteArray[0]被提升为 intunsigned int ,因此移位是合法的,甚至可能是合理的(我喜欢在执行按位时只处理unsigned类型)。

6.5.7按位移位运算符

对每个操作数执行整数提升。 结果的类型是提升的左操作数的类型。

整数促销:

6.3.1.1

如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销

转移时,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] ) );