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