为什么用文字移动负值会给出[-Wshift-negative-value]警告

时间:2017-11-01 18:54:47

标签: c

我正在对负数进行按位左移操作。

int main(void) {
    int count = 2;
    printf("%d\n", ~0<<count);
    printf("%d\n", ~0<<2); // warning:shifting a negative signed value is undefined [-Wshift-negative-value]
    return 0;
}

我怀疑的是,当在移位中使用整数文字而不是在使用变量时,编译上面的代码时会出现警告。

1 个答案:

答案 0 :(得分:3)

在C89下,需要使用“补码”和“符号 - 幅度”实现来处理负值的左移,其方式可能不是那些平台上最合乎逻辑的。例如,在一个补充平台上,C89定义-1 <&lt;&lt; 1为-3。标准的作者决定通过允许编译器编写者以他们认为合适的任何方式处理负数的左移来纠正这个问题。他们允许所有实现(包括二进制补码)的灵活性这一事实不应被视为暗示他们希望二进制补码实现偏离C89行为。更有可能的是,他们打算并期望两个补充平台上的合理行为足够明显,编译器编写者无论是否有授权都会想出来。

编译器经常在其他常量中左移左移负常数,因为x<<yx都是常量时可以简化y,但这种简化需要在编译时执行转换time 是否执行包含班次的代码。相比之下,给定someConstant << nonConstant,通常不可能进行简化,因此编译器只会生成在运行时进行转换的代码。