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的补码,因此这些代码在其他机器中的行为可能不同.
来自ISO/IEC 14882:2011第5.8/2条
E1 << E2的值是E1左移E2位位置; 空位是零填充的.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.否则,如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1×2 E2,那么这就是结果值; 否则,行为未定义
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |