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

转自:http://www.cnblogs.com/baiweiguo/archive/2013/01/15/2861286.html

参考 :http://www.hardtoc.com/archives/119

《深入理解计算机系统》在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 int或long 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超出了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型,即10000000 00000000 00000000 00000000 当做有符号,所以值为: -2147483648。

 

结论:计算机中单独的一个“-2147483648”表达式在32位机中实际值为2147483648

 

 

令 int I = 2147483648,溢出int范围,则i的值为 -2147483648   (

2147483648超出了int、long int的表示范围,故调用unsigned long int类型,即为:

   10000000 00000000 00000000 00000000   强制转换成int后二进制位不变,但是解析成int 类型有符号,所以值为: -2147483648

2147483648用unsigned型表示为:

10000000 00000000 00000000 00000000,转换为int后,即为 -2147483648的计算机中补码形式。i的值为-2147483648

 

若int I = -2147483649,则其无符型表示为

10000000 00000000 00000000 00000001,转换为int型为 -2147483647

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值