为什么我们将INT_MIN定义为-INT_MAX – 1?

AFAIK这是一个标准的“习语”

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

问题:为什么INT_MIN的定义不是-2147483648?

因为2147483648是一个long值,因为它不适合int (在具有32位int和64位long通用系统中,在具有32位long系统上,它是long long类型)。 所以-2147483648的类型是long ,而不是int

记住在C中,一个未加十进制的十进制整数常量是第一个类型intlonglong long ,它可以表示。

同样在C -2147483648中也不是整数常数; 2147483648是整型常量。 -2147483648是由一元运算符形成的表达式-和整数常量2147483648

编辑:如果你不相信-2147483648不是int类型(评论中的一些人似乎仍然怀疑),你可以尝试打印这个:

 printf("%zu %zu\n", sizeof INT_MIN, sizeof -2147483648); 

您最有可能最终得到:

 4 8 

在常见的32位和64位系统上。

另外要发表评论,我在谈论最近的C标准:使用c99或c11方言来测试这个。 c89十进制整数常量规则不同: -2147483648在c89中的类型为unsigned long 。 实际上在c89中(在c99中有所不同,见上文),未加十进制的十进制整数常量是intlongunsigned long

EDIT2 : @WhozCraig添加了另一个示例(但对于C ++),显示-2147483648不是int类型。

下面的例子虽然是在C ++中,但却将这一点推向了家。 它是使用32位架构g ++编译的。 请注意从传递的参数推导收集的类型信息:

 #include  #include  template void foo(T value) { std::cout << __PRETTY_FUNCTION__ << '\n'; std::cout << value << '\n'; } int main() { foo(-2147483648); foo(INT_MIN); return 0; } 

产量

 void foo(T) [T = long long] -2147483648 void foo(T) [T = int] -2147483648 

因为这样你只需要两个常数的幻数。 如果INT_MAX改变INT_MIN相应地改变。