This question already has answers here:
Unexpected C/C++ bitwise shift operators outcome

(6个答案)


已关闭8年。




在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

关于c - 如果我们将整数按位大小移位,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16122512/

10-12 03:21