《深入理解计算机系统》在P105页,作者给出了INT_MIN在标准头文件limits.h中的定义
- #define INT_MAX 2147483647
- #define INT_MIN (-INT_MAX - 1)
源文档 <http://blog.csdn.net/seizef/article/details/7605010>
查到了一篇文章http://www.hardtoc.com/archives/119
文中说,-2147483648是一个常量表达式,而不是一个常量。所以-2147483648被理解为一个“-”号和一个常量值2147483648。对于“-”,是对原值补码进行“取反加1”操作。
对于没有后缀的常量,计算机匹配顺序为:
C98 : int, long int, unsigned long int
C99: int, long int, long long int
由于2147483648超出了有符号常量的表示范围,所以变成了unsigned long int或long long int,而写成-2147483647 - 1则可以精确的表示成为32位有符号整数的最小值。
如以下代码:
1 |
#include <stdio.h> unsigned long int I = -2147483648; //i的值为:2147483648 if(-2147483648>0) printf("positive\n");//实际值为+2147483648 |
源文档 <http://www.hardtoc.com/archives/119>
由于-2147483648是常量表达式,其中2147483648超出了int、long int的表示范围,故调用unsigned long int类型,即为:
10000000 00000000 00000000 00000000 :无符号型,表示正数2147483648
则-2147483648,即对上式取反+1,为:
01111111 11111111 11111111 11111111 + 00000000 00000000 00000000 00000001
= 10000000 00000000 00000000 00000000 :无符型,值2147483648
即 I =2147483648;
如果令代码为 int I = -2147483648,则i被强制转换为int型,即为i的值为: -2147483648。
结论:计算机中单独的一个“-2147483648”表达式在32位机中实际值为2147483648。
令 int I = 2147483648,溢出int范围,则i的值为 -2147483648
2147483648用unsigned型表示为:
10000000 00000000 00000000 00000000,转换为int后,即为 -2147483648的计算机中补码形式。i的值为-2147483648
若int I = -2147483649,则其无符型表示为
10000000 00000000 00000000 00000001,转换为int型为 -2147483647