处理班次运营商时出现意外行为

时间:2014-09-01 19:25:11

标签: c bit-manipulation bit-shift

我的课程如下:

void main() {
   int n =0;
   printf("%x", (~0 << (32+ (~n +1) )));
}

当n = 0,~n = 0xffffffff == -1时,所以~n + 1等于0。 当我执行这个程序时,我得到0xffffffff,这是不正确的,因为(〜0 <&lt; 32)输出0。

当我用0替换(~n +1)时,它输出0.

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

您将32位宽的值移位32位 结果是不确定的,并且可以与所有你知道的蘑菇烤宽面条相同。

  

[C99: 6.5.7/3]:对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。 如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。

然后,任何进一步的分析都是愚蠢的。