GCC版本5.4.0 Ubuntu 16.04
我注意到在C语言中,当我存储一个值时或者不存储时,右移操作的结果会出现一些奇怪的行为。
这段代码片段输出的是0xf0000000
,符合预期行为。
int main() {
int x = 0x80000000
printf("%x", x >> 3);
}
以下两个代码片段将打印
0x10000000
,在我看来非常奇怪,它对负数执行逻辑移位。1.
int main() {
int x = 0x80000000 >> 3
printf("%x", x);
}
2.
int main() {
printf("%x", (0x80000000 >> 3));
}
非常感谢您的帮助。我不知道这是否是我个人电脑的特定问题,无法复制,还是C语言中的一种行为。
0x80000000
是一个无符号整数,因为它不能表示为32位有符号整数而不变成负数。因此,移位是无符号的。在移位之后将结果赋值给有符号整数不会影响结果。 - Tom Karzes0x80000000
都是一个正数;因此,无论是有符号还是无符号的,0x8000000 >> 3
的值始终为0x10000000
。 - M.Mprintf("%x", x >> 3);
causes undefined behaviour by using the wrong format specfier forint
- M.M