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

Man*_*jan 4 c bit-shift

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

void main() { int c = 1; c = c<<34;}
Run Code Online (Sandbox Code Playgroud)

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

shl eax,22h
Run Code Online (Sandbox Code Playgroud)

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

我想知道这种行为是否跨平台标准化或跨平台不同?

Ale*_*nze 7

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

至于shl eax, 22h,CPU的移位计数将被截断为5位(参见文档),该指令的确如此shl eax, 2.

  • @LefterisE就在那里,在`Vol.2B`,"SAL/SAR/SHL/SHR-Shift"部分:`计数操作数可以是立即值或CL寄存器.计数被屏蔽为5位(如果在64位模式下使用REX.W则为6位).计数范围限制为0到31(如果使用64位模式和REX.W,则为63).`您在哪里寻找它,为什么? (2认同)

Jon*_*ood 5

根据MSDN 上的这篇文章

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