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

时间:2013-04-20 16:19:53

标签: c bit-shift

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

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

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

shl eax,22h

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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

根据this article on MSDN

  

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