c – 当我离开INT_MAX时发生了什么?

我有这段代码
int a = 1;
while(1) {
    a<<=1;
    cout<<a<<endl;
}

输出中,我得到了

.
.
536870912
1073741824
-2147483648
0
0

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

解决方法

你有一个有符号的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

你无法达到INT_MAX,最多你将有2 ^ 30.

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...