AFAIK这是标准的“成语”
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
问题:为什么INT_MIN的定义不是-2147483648?
答案 0 :(得分:9)
因为2147483648
是long
值,因为它不适合int
(在具有32位int
和64位{{1}的通用系统中在具有32位long
的系统上,它的类型为long
)。因此long long
的类型为-2147483648
,而非long
。
请记住,在C中,未加十进制的十进制整数常量是第一种类型int
,int
或long
,可以表示它。
同样在C long long
中不是整数常量; -2147483648
是一个整数常量。 2147483648
是由一元运算符-2147483648
和整数常量-
组成的表达式。
编辑:如果您不相信2147483648
不属于-2147483648
类型(评论中的某些人似乎仍有疑问),您可以尝试打印此内容:
int
你最有可能最终得到:
printf("%zu %zu\n", sizeof INT_MIN, sizeof -2147483648);
在常见的32位和64位系统上。
另外,为了发表评论,我正在谈论最近的C标准:使用c99或c11方言来测试这个。 c89十进制整数常量规则不同:4 8
在c89中的类型为-2147483648
。实际上在c89中(在c99中有所不同,见上文),未加十进制的十进制整数常量的类型为unsigned long
,int
或long
。
EDIT2 :@WhozCraig添加了另一个示例(但对于C ++),以显示unsigned long
不属于-2147483648
类型。
以下示例虽然在C ++中,但却将这一点推向了家。它是用32位架构g ++编译的。请注意从传递的参数推导收集的类型信息:
int
<强>输出强>
#include <iostream>
#include <climits>
template<typename T>
void foo(T value)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
std::cout << value << '\n';
}
int main()
{
foo(-2147483648);
foo(INT_MIN);
return 0;
}
答案 1 :(得分:0)
因为这样你只需要两个常数的一个幻数。如果INT_MAX改变INT_MIN相应地改变。