【问题标题】:Bit shifting a byte by more than 8 bit将一个字节移位超过 8 位
【发布时间】:2012-08-21 07:50:05
【问题描述】:

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

  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?但我不明白它是如何工作的。

【问题讨论】:

    标签: c bit-manipulation


    【解决方案1】:

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

    6.5.7 移位运算符

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

    和整数促销:

    6.3.1.1

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

    【讨论】:

      【解决方案2】:

      无符号字符在移位时被隐式转换为整数。不确定它到底是什么类型,这取决于平台和编译器。为了得到你想要的,显式转换字节更安全,这也使它更便携,读者可以立即看到你打算做什么:

      unsigned long int anotherLongInt;
      
      anotherLongInt = ( ((unsigned long)byteArray[0] << 24) 
                     + ((unsigned long)byteArray[1] << 16) 
                     + ((unsigned long)byteArray[2] << 8) 
                     + ((unsigned long)byteArray[3] ) );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        • 2012-11-16
        • 2023-02-24
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        相关资源
        最近更新 更多