7

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

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

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

shl eax,22h

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

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

4

2 回答 2

9

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

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

于 2013-04-20T16:21:56.700 回答
5

根据MSDN 上的这篇文章

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

于 2013-04-20T16:22:56.737 回答