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

时间:2014-09-23 20:09:38

标签: c types integer signed

AFAIK这是标准的“成语”

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

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

2 个答案:

答案 0 :(得分:9)

因为2147483648long值,因为它不适合int(在具有32位int和64位{{1}的通用系统中在具有32位long的系统上,它的类型为long)。因此long long的类型为-2147483648,而非long

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

同样在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 longintlong

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相应地改变。