关于为什么中将INT_MAX定义为-INT_MAX-1

limits.h头文件中int定义

1
2
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)

原因

  • 在C语言中,-2147483648会被理解为-2147483648,是由一个符号和一个数值组合而成,而2147483648超过了int的最大表示范围。
  • C语言标准规定,强制类型转换时先改变大小再改变有符号类型,例如假设有short类型的变量n,把n转换为unsigned类型时,会先被转换为int,再转换为unsigned,而非先转换为unsigned short再转为unsigned,即等价于(unsigned)(int)short而非(unsigned)(unsigned short)short
  • 所以-2147483648会被转为更大的有符号类型long long(或long,视你电脑该数据类型大小而进行自动转换),所以最终返回的是一个long long(或 long)类型。

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<limits.h>

using namespace std;

int main()
{
//输出结果是4 8;
//可见-2147483647-1是int类型,而-2147483648是long long类型
printf("%zu %zu\n",sizeof(-2147483647-1) , sizeof(-2147483648));
return 0;
}