昨晚,朋友告诉我一个情况,如下图:
在 c/c++ 中,我们编写如下两行代码:
int a = 0;
printf("%d\n", 1 << -1);
printf("%d\n", 1 << (a-1));
令人惊讶的是有两个不同的结果,一个是 0,另一个是 -2147483648。
我们不知道为什么,任何人都可以给我帮助。
欢迎任何词。
昨晚,朋友告诉我一个情况,如下图:
在 c/c++ 中,我们编写如下两行代码:
int a = 0;
printf("%d\n", 1 << -1);
printf("%d\n", 1 << (a-1));
令人惊讶的是有两个不同的结果,一个是 0,另一个是 -2147483648。
我们不知道为什么,任何人都可以给我帮助。
欢迎任何词。
在左移运算符的右侧有一个负操作数是 C 中未定义的行为。你不应该对这样做的任何结果感到惊讶。
右侧的有符号整数是 C 语言中未定义的行为。
ISO 9899:1999 6.5.7 位移位运算符§3
对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。
如果移位表达式的右操作数为负数或右操作数大于或等于(提升的)左操作数中的位数,则结果未定义。如果右操作数为零 (0),则不执行移位操作。