右移“>>”在C99中
可能的重复:
右移运算符的奇怪行为
你好,
为什么这个函数中的两个数字都打印在相同的?这不是循环移位。
unsigned int i=0x89878685;
int main()
{
printf("0x%x\n", i);
printf("0x%x\n", i>>32);
}
$ ./a.out
0x89878685
0x89878685
所有编译器都是这样工作的吗?
Possible Duplicate:
Weird behavior of right shift operator
Hello
Why both numbers from this function are printed the same? It is not a cyclic shift.
unsigned int i=0x89878685;
int main()
{
printf("0x%x\n", i);
printf("0x%x\n", i>>32);
}
$ ./a.out
0x89878685
0x89878685
Do all compilers work in this way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将 32 位整数移位 32 位是未定义的行为。结果是不可预测的。
在 C 和 C++ 中,如果整数有
N
位,则仅允许移位少于N
位。如果您移动N
或更多,则行为未定义。实际上,当移位 32 位整数时,某些平台会简单地将移位计数解释为 5 位值(丢弃低 5 位以上的任何位),这意味着
32
将被解释为相同的方式为0
。这显然是您的平台上发生的情况。该值根本没有改变。Shifting a 32-bit integer by 32 bits is undefined behavior. The result is not predictable.
In C and C++ if the integer has
N
bits, you are only allowed to shift by less thenN
bits. If you shiftN
or more the behavior is undefined.In practice, when shifting a 32-bit integer, some platforms will simply interpret the shift count as a 5-bit value (discard any bits above the lower 5), meaning that
32
will be interpreted the same way as0
. This is apparently what happens on your platform. The value is not shifted at all.