#include <stdio.h>
int main()
{
printf("%zu\n", sizeof(-2147483648));
printf("%zu\n", sizeof(-2147483647-1));
return 0;
}
以上代码作为输出(gcc):
8
4
为什么-2147483648
会自动提升为1 st long
中的printf
,即使它适合int
?
另外,我在MinGW中尝试了同样的方法,它给出了输出:
4
4
有人可以解释一下发生了什么吗?
答案 0 :(得分:10)
数字2147483648太大而无法容纳int
,因此会提升为long
。
然后,在数字已经提升为long
之后,计算其负数,产生-2147483648。
如果您感到好奇,可以查看limits.h
。在我的平台上,它使用glibc,
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
在MinGW上,sizeof(long) == 4
,促销long
不会削减它。根据C11标准,该值必须提升为long long
。这不会发生,可能是因为你的MinGW编译器默认为C90或更早版本。
答案 1 :(得分:7)
-2147483648
是应用了一元减号运算符的整数常量表达式2147483648
。
您的系统似乎都有int
和long
为32位,long long
为64位。
由于base-10常量2147483648
不能适合long int
,因此在C99中它的类型为long long int
。但是,C90没有这种类型,所以在C90中它有类型unsigned long int
。
正如您所说,此问题的常见解决方法是编写-2147483647 - 1
。如果您检查系统INT_MIN
,您可能会看到与limits.h
的定义类似的内容。
关于输出4
,这表明您的MinGW系统上使用的是C90,而在您的其他系统上,您使用的是C99或C11(或C ++或GCC扩展)。