在 Visual Studio 编译以下 C 代码时,结果为 4。
void main() { int c = 1; c = c<<34;}
从 Visual Studio 反汇编窗口中看到的汇编代码是
shl eax,22h
从汇编中,很容易看出我们正在移位 34。由于这里的整数是 4 字节,从结果中可以明显看出,在机器级别进行了模运算,使其工作为移位 2。
我想知道这种行为是跨平台标准化还是跨平台变化?
发生未定义的行为。这是由语言标准标准化的(参见6.5.7 Bitwise shift operators
1999 年的 C 标准部分)。然而,UB 的可观察效果不是标准化的,并且可能会有所不同。
至于shl eax, 22h
,移位计数将被 CPU 截断为 5 位(参见文档),这条指令的行为实际上是shl eax, 2
.
根据MSDN 上的这篇文章:
如果移位表达式的右操作数为负数或右操作数大于或等于(提升的)左操作数中的位数,则结果未定义。如果右操作数为零 (0),则不执行移位操作。