【问题标题】:Why is the size of the data type different when the value is directly passed to the sizeof operator?为什么直接将值传给sizeof操作符时,数据类型的大小不一样?
【发布时间】:2019-12-10 18:49:48
【问题描述】:
#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;
}

输出是:

8 4 4 4 4 1

为什么相同值的输出不同?

【问题讨论】:

  • 6.5 不是浮点数,而是double
  • printf("%d",sizeof(6.5f)); 使其成为float
  • "为什么这里的输出不同?"为什么应该是一样的?您可以将一个分配给另一个这一事实并不意味着它们具有完全相同的类型。
  • 格式说明符应该是,例如printf("%zu", sizeof(6.5));

标签: c int sizeof


【解决方案1】:

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

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

打印出来的尺寸就是以上类型的尺寸。

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

【讨论】:

    【解决方案2】:

    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 类型的操作数时,无符号 char 或 signed 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

    如果第一次调用使用类似浮点类型的常量,则这些调用可以获得相同的结果

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

    【讨论】:

      【解决方案3】:

      因为这些值对sizeof 无关紧要。这是类型的大小。

      • 字符常量是ints,而不是chars。

      • 浮点常量默认为doubles,除非您使用fl作为后缀。

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 2011-04-23
        • 2011-02-26
        • 2018-01-23
        • 2017-11-17
        相关资源
        最近更新 更多