【问题标题】:Strange behavior of bit-shift [duplicate]位移的奇怪行为[重复]
【发布时间】:2015-08-03 18:54:12
【问题描述】:

无法理解这种位移的行为:

int container = 1;

cout<<(container>>32)<<endl;

如果是逻辑移位,则输出应该是 0,但它是 1,就好像它是循环移位一样。在查看反汇编时,我看到使用的命令是 SAR。请向我解释这种行为。

【问题讨论】:

  • 你的编译器应该已经警告你了。您是否尝试过-Wall 选项?
  • Visual Studio 产生警告。在 X86 / X64 上,32 位操作数移位指令仅使用计数的低 5 位,在这种情况下:32&0x1f == 0。您可以使用容器 >>= 31;容器 >>= 1;这会起作用(应该在 X86 / X64 上产生 0 或 -1)。

标签: c++ bitwise-operators bit-shift


【解决方案1】:

您将一个 32 位数字移位了 32,这会导致未定义的行为,结果 1 是巧合。

【讨论】:

  • 是的,这是未定义的行为。但是我在不同的编译器上尝试了不同的值,但它总是一样的。
  • 这意味着它不是未定义的行为,因为......?我会在不同的架构上尝试一下,看看会发生什么。
  • 我并不是说这不是未定义的行为。我只是想了解为什么会这样。
  • 如果移位数大于操作数长度,编译器会尝试余数(提醒每个操作数长度的移位数除法)
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2015-07-26
  • 2020-04-26
相关资源
最近更新 更多