Because 2147483648
is a long
值,因为它不适合int
(在32位通用系统中int
和 64 位long
,在 32 位系统上long
它是类型long long
). So -2147483648
属于类型long
, not int
.
请记住,在 C 中,无后缀的十进制整数常量属于第一种类型int
, long
or long long
它可以在哪里被代表。
也在C语言中-2147483648
不是整数常量;2147483648
是一个整数常量。-2147483648
是由一元运算符构成的表达式-
和整数常量2147483648
.
EDIT:如果你不相信-2147483648
不属于类型int
(评论中有些人似乎仍然怀疑),你可以尝试打印这个:
printf("%zu %zu\n", sizeof INT_MIN, sizeof -2147483648);
您很可能最终会得到:
4 8
在常见的 32 位和 64 位系统上。
另外,为了遵循评论,我正在谈论最近的 C 标准:使用 c99 或 c11 方言来测试它。 c89 对于十进制整型常量的规则是不同的:-2147483648
属于类型unsigned long
在c89中。事实上,在c89中(在c99中有所不同,见上文),无后缀的十进制整数常量的类型int
, long
or unsigned long
.
EDIT2: @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;
}
Output
void foo(T) [T = long long]
-2147483648
void foo(T) [T = int]
-2147483648