我正在对负数进行按位左移操作。
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;
}
我的疑惑是为什么当整数文字用于移位而不是使用变量时编译上面的代码时会出现警告。
最佳答案
在 C89 下,需要补码和符号幅度实现来处理负值的左移,而这些方式在这些平台上可能不是最合乎逻辑的。例如,在一个补码平台上,C89 将 -1<<1 定义为 -3。该标准的作者决定通过允许编译器作者以他们认为合适的任何方式处理负数的左移来纠正这个问题。事实上,他们允许所有实现(包括补码实现)具有灵 active 这一事实不应被视为暗示他们打算让补码实现偏离 C89 行为。更有可能的是,他们打算并期望二进制补码平台上的合理行为足够明显,以至于编译器编写者无论有没有授权都会弄清楚。
编译器经常提示负常量被其他常量左移,因为 x<<y
当x
都可以简化和 y
是常量,但这种简化需要在编译时执行移位,无论是否执行包含移位的代码。相比之下,给定 someConstant << nonConstant
,通常不可能进行任何简化,因此编译器只会生成在运行时进行移位的代码。
关于c - 为什么用文字移动负值会给出 [-Wshift-negative-value] 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47061774/