32位int的表示范围为:
-2147483648 ~ 2147483647
#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */
为什么不直接定义为:-2147483648呢?
同时我在一本C语言的书中看到,只有在int范围内的全部由数字组成的值才是int常量。换而言之,0和所有的负整数都不能称为常量,因为它相当于对常量进行了取负运算,按书中的说法,是表达式。
首先用如下代码进行验证:
cout << typeid(-2147483647-1).name() << endl;
cout << typeid(-2147483648).name() << endl;
运行结果如下:
int
unsigned long
果然,-2147483648不同于-2147483647-1。
那我们是不是可以这样理解,对编译器而言,它首先看到的是正整数2147483648,然后再对其进行求负运算。由于2147483648超出了int的范围,所以-2147483648也不是int类型了。这也是系统头文件中不直接这样定义INT_MIN的原因吧。