为什么宏INT_MIN要写成-2147483647-1

《深入理解计算机系统》在P105页,作者给出了INT_MIN在标准头文件limits.h中的定义

 

  1. #define INT_MAX 2147483647 
  1. #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 intlong long int,而写成-2147483647 - 1则可以精确的表示成为32位有符号整数的最小值。

 

如以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13

#include <stdio.h>
#include <limits.h>
#include <float.h>
 
int main(void)
{

          unsigned long int I = -2147483648;  //i的值为2147483648

        if(-2147483648>0)     printf("positive\n");//实际值为+2147483648
       
if(-2147483647-1<0)printf("negative\n");
       
if(INT_MIN==-INT_MIN)printf("equal\n");
       
if(FLT_MIN>0)         printf("floating\n");
 
        return0;
}

 

源文档 <http://www.hardtoc.com/archives/119>

 

由于-2147483648是常量表达式,其中2147483648超出了intlong 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

posted @ 2013-01-15 15:28  winko  阅读(1356)  评论(0编辑  收藏  举报