关于为什么中将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() { printf("%zu %zu\n",sizeof(-2147483647-1) , sizeof(-2147483648)); return 0; }
|