将一个字节移位超过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]
被提升为 int
或unsigned 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] ) );