为什么-2147483648在适合int时会自动提升为long?

时间:2014-09-04 06:21:15

标签: c gcc mingw sizeof

#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  

有人可以解释一下发生了什么吗?

2 个答案:

答案 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

您的系统似乎都有intlong为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扩展)。