【问题标题】:What happens if we bitwise shift an integer more than its size [duplicate]如果我们按位移动一个大于其大小的整数会发生什么
【发布时间】:2013-04-21 00:22:56
【问题描述】:

在 Visual Studio 编译以下 C 代码时,结果为 4。

void main() { int c = 1; c = c<<34;}

从 Visual Studio 反汇编窗口中看到的汇编代码是

shl eax,22h

从汇编中,很容易看出我们正在移位 34。由于这里的整数是 4 字节,从结果可以看出,在机器级别进行了模运算,使其工作为移位 2。

我想知道这种行为是跨平台标准化还是因平台而异?

【问题讨论】:

  • 如果我们将 main 声明为 void main() {...} 会怎样?
  • 你在什么架构下运行程序? i386 ?
  • 它的 x86-64 但我的窗口是 32 位的。
  • @wildplasser 带有这些点,它会给出编译错误

标签: c bit-shift


【解决方案1】:

发生未定义的行为。这是由语言标准标准化的(参见 1999 年 C 标准的6.5.7 Bitwise shift operators 部分)。然而,UB 的可观察效果不是标准化的,并且可能会有所不同。

至于shl eax, 22h,移位计数将被 CPU 截断为 5 位(参见文档),这条指令的行为实际上与 shl eax, 2 相同。

【讨论】:

  • @LefterisE 就在那里,Vol. 2BSAL/SAR/SHL/SHR—Shift 部分:The count operand can be an immediate value or the CL register. The count is masked to 5 bits (or 6 bits if in 64-bit mode and REX.W is used). The count range is limited to 0 to 31 (or 63 if 64-bit mode and REX.W is used). 你在哪里找它,为什么?
  • 我想确认您所说的话以支持您的回答
【解决方案2】:

根据this article on MSDN

如果移位表达式的右操作数为负数或右操作数大于或等于(提升的)左操作数中的位数,则结果未定义。如果右操作数为零 (0),则不执行移位操作。

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 2019-03-20
    • 2021-11-22
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多