我正在对负数进行按位左移运算。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 编译器经常用其他常量来向左偏移负常量,因为当x<<y和x都是常量时,可以简化y,但是无论是否执行包含移位的代码,这种简化都需要在编译时执行移位。相比之下,给定someConstant << nonConstant,通常将不可能进行简化,因此编译器将只生成在运行时进行移位的代码。关于c - 为什么用文字移动负值会给出[-Wshift-负值]警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47061774/ 10-11 23:09