#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
在这里,INT_MIN 为什么不写成 -2147483648,-2147483648是一个常量表达式,而不是一个常量。所以-2147483648被理解为一个“-”号和一个常量值2147483648。对于“-”,是对原值补码进行“取反加1”操作。最小的整形数数值是-2147483648。他的相反数就是2147483648,但是这个正数是溢出的,超出了有符号常量的表示范围,整型数的范围是在INT_MIN到INT_MAX之间。由int开始,因为2147483648超过了int的最大取值范围2147483647,所以变成了unsigned long int或long long int,而写成-2147483647 - 1则可以精确的表示成为32位有符号整数的最小值。按照C语言的表达式求值规则,原本可能使用的x < INT_MIN这样的表达式,x被转换为long int类型再进行表达式求值了,便有可能会出现一些预料之外的结果,而按照-2147483647-1这样的定义,不会被认为是long int类型的。
#include <stdio.h>
#include <limits.h>
int main()
{
int i = INT_MIN;
printf("%d",-i);
return 0;
}
返回结果是:-2147483648。
我们可以认为上面的结果是有负溢出产生的。负溢出指的是,当两个负数相加的时候,如果因为溢出而导致结果是0或者正数。
按照这个加法原理,INT_MIN+INT_MIN=0。
如果从二进制代码的角度考虑,比如两个8位数相加:
10000000
+ 10000000
=100000000
由于结果超出了8位,这时候第九位会被截去,结果就是0。