为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

yuh*_*luo 5 c

#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
Run Code Online (Sandbox Code Playgroud)

我在看csapp这本书的时候,发现作者提出了这个问题,但是我不明白为什么要这么定义。-2147483647和直接用定义有什么区别?

小智 11

#include <stdio.h>

int main() {
    printf("%d, %zu\n",-2147483647-1,  sizeof(-2147483647-1)); 
    printf("%d, %zu\n",(int)-2147483648, sizeof(-2147483648)); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

-2147483648, 4
-2147483648, 8
Run Code Online (Sandbox Code Playgroud)

标准说:

整数常量以数字开头,但没有句点或指数部分。它可能有一个指定其基数的前缀和一个指定其类型的后缀。

请注意,-不是常量的一部分。它是一个否定运算符,在解释常量后应用。

因此-2147483648,对于 ,编译器将使用该2147483648部分来确定其类型。为此,该标准规定:

整数常量的类型是可以表示其值的相应列表中的第一个。

由于没有后缀指定其类型,并且2147483648不能用 int 表示(如 INT_MAX 2147483647),因此其类型将是long int,然后sizeof INT_MIN将是 8,这是错误的。