sizeof(2147483648) 是 8 个字节,而 sizeof(2147483647+1) 是 4 个字节
sizeof(2147483648) is 8 bytes while sizeof(2147483647+1) is 4 bytes
#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但是里面没有讨论第二种情况。
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
会在您的系统中调用未定义的行为(INT_MAX + 1
溢出和有符号整数溢出是 C 中的未定义行为),但 sizeof(2147483647+1)
不会调用未定义的行为,因为在这种情况下,sizeof
的操作数未被评估。
#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但是里面没有讨论第二种情况。
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
会在您的系统中调用未定义的行为(INT_MAX + 1
溢出和有符号整数溢出是 C 中的未定义行为),但 sizeof(2147483647+1)
不会调用未定义的行为,因为在这种情况下,sizeof
的操作数未被评估。