C++中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
因为int占4字节32位,根据二进制编码的规则:
INT_MAX = 2^31-1,INT_MIN= -2^31.
在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义 INT_MIN 为(-INT_MAX -1)
思考:
上溢是2147483647很容易理解,2147483647=2^31-1 (因为要有一个符号位,所以把第一位作为符号位,0为正,1为负),但为什么下溢的时候分明是31位来表示的数会出现2147483648呢??
我们以八位整数为例:
00000000~01111111, 表示0~127。10000001到11111111,表示-1到-127。大家可以注意到,10000000我们没有用到。因为如果我们把它看成-0,那么会和00000000发生重复。于是计算机将10000000定义为-128(即在最终进位后符号位不产生进位)。
(1) 对于无符号n位整数,表示范围很好理解[0 ~ 2^n−1];
(2)(2) n位有符号整数的表示范围为[−2^(n−1) ~ 2^(n−1)−1],对于有符号整数,计算机使用补码表示。具体见《反补码运算之 “1 - 1 = - 1 ” ?》