【发布时间】: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