如果我们按位移动一个超过其大小的整数会发生什么

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

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

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

 shl eax,22h 

从汇编开始,我们很容易看到我们正在转移34.由于这里的整数是4个字节,从结果来看很明显,模数运算是在机器级别上进行的,以使其工作为2。

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

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

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

根据MSDN上的这篇文章 :

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