#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)
我发现了类似的问题,但没有讨论第二种情况。
用C整数常量的规则是整数常数的小数具有其中它可以在被表示到第一类型:int
,long
,long long
。
2147483648
不适合int
您的系统(因为系统中的最大值int
为2147483647
),因此其类型为long
(或long long
取决于系统)。因此,您正在计算sizeof (long)
(或sizeof (long long)
取决于您的系统)。
2147483647
是int
系统中的一个,如果添加1
到中,int
它仍然是一个int
。所以你在计算sizeof (int)
。
请注意,sizeof(2147483647+1)
将系统中的未定义行为称为INT_MAX + 1
溢出,而有符号整数溢出是C中的未定义行为。
请注意,尽管通常会2147483647+1
在系统中调用未定义的行为(C中的INT_MAX + 1
溢出和有符号整数溢出是未定义的行为),sizeof(2147483647+1)
但不会调用未定义的行为,因为sizeof
在这种情况下不会评估操作数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句