为什么我们将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中,一个未加十进制的十进制整数常量是第一个类型int
, long
或long 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中有所不同,见上文),未加十进制的十进制整数常量是int
, long
或unsigned 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相应地改变。