我离开INT_MAX后发生了什么?

Aks*_*Aks 6 c++ bit-manipulation

我有这段代码

int a = 1;
while(1) {
    a<<=1;
    cout<<a<<endl;
}
Run Code Online (Sandbox Code Playgroud)

在输出中,我得到了

.
.
536870912
1073741824
-2147483648
0
0
Run Code Online (Sandbox Code Playgroud)

为什么我没有达到INT_MAX?除此之外真正发生了什么?

fed*_*024 12

你有一个有符号的int,所以数字是二进制补码.这就是发生的事情

00..01 = 1
00..10 = 2
[...]
01..00 = 1073741824
10..00 = -2147483648 // Highest bit to one means -01..11 - 1 = -(2^31)
00..00 = 0
Run Code Online (Sandbox Code Playgroud)

你最多不能达到INT_MAX 2^30.

正如评论中指出的那样,c ++标准不强制执行2的补码,因此这些代码在其他机器中的行为可能不同.

  • +1最后一个答案显示了在bitlevel上发生了什么.现在,您应该只添加"INT_MAX"的位表示,以显示它从未到达的原因. (2认同)

αλε*_*λυτ 7

来自ISO/IEC 14882:2011第5.8/2条

E1 << E2的值是E1左移E2位位置; 空位是零填充的.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.否则,如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1×2 E2,那么这就是结果值; 否则,行为未定义