将一个字节移位超过8位

时间:2012-08-26 15:57:30

标签: c bit-manipulation

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字节?但我不知道它是如何运作的。

2 个答案:

答案 0 :(得分:8)

在该算术上下文 byteArray[0]被提升intunsigned 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] ) );