3

昨晚,朋友告诉我一个情况,如下图:

在 c/c++ 中,我们编写如下两行代码:

int a = 0;
printf("%d\n", 1 << -1);
printf("%d\n", 1 << (a-1));

令人惊讶的是有两个不同的结果,一个是 0,另一个是 -2147483648。

我们不知道为什么,任何人都可以给我帮助。

欢迎任何词。

4

3 回答 3

7

在左移运算符的右侧有一个负操作数是 C 中未定义的行为。你不应该对这样做的任何结果感到惊讶。

于 2013-10-17T11:42:17.213 回答
4

右侧的有符号整数是 C 语言中未定义的行为。

ISO 9899:1999 6.5.7 位移位运算符§3

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

于 2013-10-17T11:43:40.460 回答
0

如果移位表达式的右操作数为负数或右操作数大于或等于(提升的)左操作数中的位数,则结果未定义。如果右操作数为零 (0),则不执行移位操作。

检查这个 msdn 链接

于 2013-10-17T11:44:21.447 回答