右移“>>”在C99中

发布于 2024-11-01 05:42:49 字数 406 浏览 1 评论 0原文

可能的重复:
右移运算符的奇怪行为

你好,

为什么这个函数中的两个数字都打印在相同的?这不是循环移位。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

油饼 2024-11-08 05:42:49

将 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 then N bits. If you shift N 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 as 0. This is apparently what happens on your platform. The value is not shifted at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文