位移位:移位计数 >= 类型宽度

Bit Shifting: Shift Count >= Width Of Type

下面的代码在编译时会抛出由第 9 行引起的警告:

warning: shift count >= width of type [-Wshift-count-overflow]

然而,第 8 行并没有抛出类似的警告,尽管 k == 32(我相信)。我很好奇为什么会发生这种行为?我正在使用 gcc 编译器系统。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int bit_shift(unsigned x, int i){
    int k = i * 8;
    unsigned n = x << k; /* line 8 */
    unsigned m = x << 32; /* line 9 */
    return 0;
} 

int main(){
    bit_shift(0x12345678, 4);
    return 0;
}

bit_shiftk 的值取决于参数 i。并且因为 bit_shift 没有声明 static 它可能会被其他翻译单元调用(阅读:其他源文件)。

所以它不能在编译时确定这个移位将永远是一个问题。这与总是移动无效量的行 unsigned m = x << 32; 形成对比。

我认为为什么第 8 行没有发出警告是因为左移一个 unsigned int32 >= 32 位 不是未定义的行为

C 标准(N2716,6.5.7 移位运算符)说:

The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1 × 2^E2, reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 × 2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined