在C语言limits.h头文件中对INT_MIN有一个有趣的定义,它被定义为-INT_MAX-1而不是-2147483648。
对于这种定义的解释是-2147483648不是一个常量,而是一个表达式,它是由一个整型2147483648和一个减号运算符组成,因为在C语言中整型的定义为: 以数字开始,并且不包含小数点或指数部分,但它可能会包含一个表示进制的前缀以及一个表示类型的后缀。
因此C语言在对一个没有明确表示数据类型的整数常量进行储存的时候他会以以下顺序对其匹配:C89-int,long int,unsigned long int
C99-int,long int,long long int
C ++-int,long int,long long int
当所匹配到的类型足以表达该数的时候,该数将会被用这个类型表示。
也就是说-2147483648这个数字首先将会被表示成一个long int或unsigned long int类型的数值2147483648(因为2147483648如果用int表示就会溢出),然后再对它取反,变为-2147483648,而此时-2147483648是long int或unsigned long int类型,这可能会在进行某些运算时出现错误,因此在定义INT_MIN的时候采用了一些小技巧避免了这种错误的发生。
下面我们来做一个测试,验证这是否正确。
简单的方法就是直接展示一下各个数字在内存中储存的长度:
#include
#include
int main() {
int i = INT_MIN;
int j = -2147483648;
printf("i = %d, j = %dn", i, j);
printf("sizeof i = %ld, j = %ld, num = %ldn", sizeof(i), sizeof(j), sizeof(-2147483648));
return 0;
}
其结果为:i = -2147483648, j = -2147483648
sizeof i = 4, j = 4, num = 8
这里很明显说了数值-2147483648被定义为long int或unsigned long int。因此该实验结果足以证明以上结论的正确性。