为什么将值直接传递给sizeof运算符时数据类型的大小不同?

问题描述 投票:2回答:2
#include <stdio.h>
int main(){
char a ='A';
int b = 90000;
float c =6.5;
printf("%d",sizeof(6.5));
printf("%d",sizeof(90000));
printf("%d",sizeof('A'));
printf("%d",sizeof(c));
printf("%d",sizeof(b));
printf("%d",sizeof(a));
return 0;
}

为什么输出在这里不同?我得到的此代码的输出是844441为什么这样?谁能解释

c++ c int sizeof
2个回答
5
投票

常量,像变量一样,有自己的类型:

  • 6.5:类型为double的浮点常量
  • [90000:类型为int(如果int为32位)或long(如果int为16位)的整数常数]
  • ['A':C中为int类型,C ++中为char类型的字符常量

打印的尺寸是上述类型的尺寸。

此外,sizeof运算符的结果具有类型size_t。因此,在打印时,要使用的正确格式说明符是%zu,而不是%d


1
投票

C中的字符常量(与C ++相反)具有类型int。所以这个电话

printf("%d",sizeof('A'));

输出4。即sizeof( 'A' )等于sizeof( int )

从C标准(6.4.4.4字符常量)

10 一个整数字符常量的类型为int ....

另一方面(6.5.3.4 sizeof和alignof运算符)

4当将sizeof应用于具有char类型,无符号的操作数时字符或带符号的字符(或其限定版本),结果为1。

因此,在此表达式sizeof中,sizeof( 'A' )运算符的操作数的类型为int,而在此表达式sizeof( a )中,a的声明如下:>

char a = 'A';

操作数的类型为char

请注意这样的呼叫

printf("%d",sizeof(6.5));

使用错误的转换格式说明符。你必须写

printf("%zu",sizeof(6.5));

也在上述调用中,在此调用中使用了类型为double的常量

printf("%zu",sizeof(c));

变量c具有类型float

如果第一个调用使用了float类型的常量,则这些调用会得到相同的结果

printf("%zu",sizeof(6.5f));

推荐问答