#include<stdio.h>
int main()
{
printf("%d\n", sizeof(2147483648));
printf("%d" , sizeof(2147483647+1));
return 0;
}
输出:
8
4
我知道sizeof(2147483648)
是8个字节,因为它不能容纳4个字节并被提升为long long int
。但我不明白在sizeof(2147483647+1)
我找到了similar question,但没有讨论第二种情况。
答案 0 :(得分:19)
C中的整数常量规则是十进制整数常量具有可在其中表示的第一种类型:int
,long
,long long
。
2147483648
不适合您系统中的int
(因为系统中int
的最大值2147483647
)因此其类型为long
(或{{ 1}}取决于你的系统)。因此,您正在计算long long
(或sizeof (long)
,具体取决于您的系统)。
sizeof (long long)
是您系统中的2147483647
,如果您将int
添加到1
,它仍然是int
。所以你正在计算int
。
请注意 sizeof (int)
在系统中调用未定义的行为,因为sizeof(2147483647+1)
溢出,并且有符号整数溢出在C中是未定义的行为。
请注意,虽然通常INT_MAX + 1
在系统中调用未定义的行为(2147483647+1
溢出且有符号整数溢出是C中的未定义行为,但INT_MAX + 1
不会调用未定义的行为作为操作数在这种情况下,sizeof(2147483647+1)
不会被评估。