C/C++ 中的 int 范围
以 C/C++ 为例,int 类型的位数(通常为 32 位),以及其最大值和最小值的计算公式:
- 最大值:
2^{31} - 1(即 2147483647) - 最小值:
-2^{31}(即 -2147483648)
为什么是这样呢?
补码
我们先要理解计算机编码的基本规则,补码。
理解补码,就要理解的产生是为了解决反码里面无法解决的目的就是为了刚好实现 1 + (-1) = 0 的问题!在 int 类型里面,有 4 字节,32bit,1 的补码是 0000_0001, 最高位是符号位,取反 ffff_fffe ,这就是 -1 的反码,但是这和 1 相加不等于 0 呀。那么,再加 1 ffff_ffff,那么这就是 -1 的补码了。因此 -1 的补码就是可以通过其正数取反 +1 。
补码下的最大最小值
很多时候,我们在设计定义了一个 int 变量,用来存储运算结果的最大值或者最小值,于是我们需要将其初始化定义其为最大值或者最小值。
那么,其 int 最大值或者最小值是多少呢?
答案:以 4 字节大小为 int 的操作系统里面,最大值:(1 << 31) - 1 ; 最小值:1 << 31 。
为什么呢?我们不妨假设一个变量类型只有 4bit,方便来学习,因为计算机里面都采用补码来表示(我建议不用专门去背诵补码的定义,那样太死板且容易混淆,理解:补码的产生是根本上是为了解决 1 + (-1) = 0 的问题,可以看前一小节)。对于这个 4bit 的数,最高位用于符号位:0 为正数,1 为负数。
那么, b0001 为 1, b1111 为 -1,相加刚好因为全部进位,得到 0。同理:
b0010 为 2, b1110 为 -2;
b0011 为 3, b1101 为 -3;
…
b0111 为 7, b1001 为 -7;
7 已经是 4bit 变量能表示的正数里面最大的了,为 (1 << 3) - 1 ; 但是 -7 的反码为 b1001, 那么和 0 b0000 相对的 b1000 还没有出现,我们就认为 b1000 表示为 -8,也就是 1 << 3。所以,对于 4bit 的变量来说,可以表示的范围为 -8~7, 最大值:(1 << 3) - 1 ; 最小值:1 << 3 。
同理,4Bytes,32bit 的 int 大小就能理解了。

