据我所知,这是一个标准的“习语”。
# 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
。
编辑2:@WhozCraig提供了另一个示例(但是针对C++),以显示-2147483648
不是int
类型。
以下示例虽然是在C++中,但是强调了这一点。它使用32位架构的g++编译。请注意从传递的参数推导中获取的类型信息:
#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;
}
输出
void foo(T) [T = long long]
-2147483648
void foo(T) [T = int]
-2147483648
2147483648
作为值(在应用单目负号之前)赋给int
类型是不可表示的。 - WhozCraig-2147483648
不是整数常量。2147483648
是整数常量。-2147483648
是带有一元负号操作的整数常量 2147483648
。 - ouah
int foo = -2147483648;
,看看编译器是否会报错。我很好奇结果如何。 - Jason Hu