(转)为什么宏INT_MIN要写成-2147483647-1
来源:互联网 发布:海关数据工作 编辑:程序博客网 时间:2024/06/06 01:27
原博地址:http://www.cnblogs.com/baiweiguo/archive/2013/01/15/2861286.html
《深入理解计算机系统》在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
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型,即为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
- 为什么宏INT_MIN要写成-2147483647-1
- (转)为什么宏INT_MIN要写成-2147483647-1
- 为什么INT_MIN不是直接写成-2147483648
- 宏定义 :#define INT_MIN (-2147483647 - 1)
- INT_MIN 写成 (-2147483647 - 1) 和 vs中 warning C4018: “>”: 有符号/无符号不匹配的深入剖析。
- INT_MIN
- INT_MIN
- INT_MAX (2147483647) 和INT_MIN (-2147483648)
- Why define INT_MIN (-INT_MAX - 1)
- 为什么要写成List a = new ArrayList()
- 析构函数为什么要写成虚函数
- C++中析构函数为什么要写成虚函数
- 为什么文件路径 Program Files 可以写成 Progra~1
- 为什么文件路径 Program Files 可以写成 Progra~1
- 为什么文件路径 Program Files 可以写成 Progra~1
- C++:析构函数写成虚函数是干什么用的,为什么要这么写?
- 不清楚为什么写成 CALLBACK* DlgCloseUDPNet 类型
- 为什么C++基类析构函数写成虚函数
- 玩儿转Swift——学习笔记(持续更新)
- Python 的 Numpy SciPy MatPlotLib配置
- HDU 1166 敌兵布阵 // 线段树
- 机房收费系统之组合查询
- 【四】nginx的数据结构(2)——自己动手重写红黑树
- (转)为什么宏INT_MIN要写成-2147483647-1
- SpringMVC详细示例实战教程
- hdu 5385 The path (贪心+最短路径树)
- C++内存管理
- Docker 入门
- 断其一指------Handler消息传递机制
- 转载自--ComponentOne技术服务--不得不爱开源 Wijmo jQuery 插件集
- (4.1.34)Android侧滑菜单DrawerLayout的使用
- 原码, 反码, 补码 详解