4

这里 从字节缓冲区转换回无符号长整数时:

  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位的。也许它正在移动连续 4 个字节的整个 byteArray?但我不明白这是如何工作的。

4

2 回答 2

8

在那个算术上下文中byteArray[0]被提升为intor unsigned int,所以这种转变是合法的,甚至可能是明智的(我喜欢unsigned在做按位处理时只处理类型)。

6.5.7 移位运算符

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

和整数促销:

6.3.1.1

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

于 2012-08-26T15:59:10.127 回答
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] ) );
于 2012-08-26T16:03:55.643 回答