【问题标题】:Does the implicit type conversion change the size of the variable隐式类型转换是否会改变变量的大小
【发布时间】:2013-08-15 08:01:54
【问题描述】:

例如,

#include <stdio.h>

int main (void) {

    int x = 5;
    double y = 6;
    int z = x+y;

    printf("size of z = %d bytes",sizeof(z));

    return 0;
}

输出是4字节,为什么不转换成双精度并占用8字节的内存作为双精度。

【问题讨论】:

  • 因为它是intz不会转换为 double
  • 您的printf 格式也不正确。它应该是%zu,因为sizeof 的类型是size_t,并且应该在末尾包含\n

标签: c


【解决方案1】:

不,sizeof z 将永远是 sizeof(int)

当你这样做时:

int z = x+y;

x 的值将转换为double,因为y 是双倍的,但这不会改变x。而x+y(typedouble)的结果会被转换成int,并赋值给z

【讨论】:

  • 您说 x 将被转换为 double 但这不会改变 x,如何??!! @雨浩
  • @ArmiaWagdy:注意x提升为double仅在表达式中,这并不意味着x本身被覆盖对于double,C/C++ 是“静态类型语言”(与“动态类型语言”例如 Python 形成对比),这意味着变量的类型不能更改。也可以试试sizeof(x + y) 你会得到== sizeof(double)
  • @ArmiaWagdy 您可能想阅读:Dynamic type languages versus static type languages
  • @YuHao 对了,5提升到double的时候就是5.0了,怎么存到内存?例如 5 将是 00000101 。 5.0会是什么?,抱歉被关注
  • @ArmiaWagdy Google 关于 lvaluervalue 之间的区别,应该会有所帮助。
【解决方案2】:

阅读描述您的代码行为的 cmets

#include <stdio.h>

int main (void) {

int x = 5;
double y = 6;
int z = x+y; // 5 (int, 4 bytes) + 6 (double, 8 bytes)
             // converting `int` to `double` when adding them ()
             // 5.0 (double, 8 bytes) + 6.0 (double, 8 bytes)
             // 11.0 (double, 8 bytes)
             // But! `z` is of type `int`, so it will not convert to `double`
             // Then 11.0 converts to 11 because `z`... is of type `int`! 
            /// read "Double-precision floating-point format" and you'll see why.
             // So,  z = 11 (`z` is of type `int`, so it's size is *4* bytes )
             // Here is your 4 bytes instead of 8! ;)

printf("size of z = %d bytes",sizeof(z));
return 0;

}

【讨论】:

  • 发布问题的人说“输出是 4 个字节,为什么它不转换为双精度并占用 8 个字节的内存作为双精度”.. 你想回答什么?
  • 我的意思是提问者说他​​收到了 4 个字节的输出......为什么不是 8 个字节......他想了解为什么输出是 4 个字节......你正在解释为什么它是 8 个字节.. 再次仔细阅读问题..
  • 有两种类型的类型转换:隐式和显式。隐式:转换是从高到低..这就是这里发生的事情..而显式转换是从低到高: 编译器不会自动执行.. 所以在这个程序中转换是自动=隐式=从双精度到整数..
  • @Abhishek, z = 5 + 6.0 ---> z = 5.0 + 6.0 ---> z = 11.0 ---> z = 11; z 是 11 (int),大小为 4 个字节。我想知道我是不是弄错了……怎么了?
  • 这是分手:z = 5 + 6.0 ---> z = 5 + 6---> z = 11; z 是 11 (int)
【解决方案3】:

您已将 z 定义为整数。在执行“x+y”时,加法确实发生在双倍大小上,但在分配时会执行隐式转换并截断结果以适应 z 的大小。

【讨论】:

    【解决方案4】:

    由于您声明 z 是 int,所以它将是 int。并且每一种可能的转换都将从任何类型转换为 int:

      int z = whatever (legal) formula you put here; 
      sizeof(z); /* <- 4 */
    

    相反temporal x + y 的值是 double 最终转换为 int

      int x = 5;
      double y = 6;
      int z = x+y; /* x + y = 11.0 since y = 6.0; which is converted to 11*/
    

    【讨论】:

    • 当变量 x 提升为 double 时,是否需要 64 个字节而不是 32 个字节。如果不是,编译器如何处理这种隐式转换?
    • 据我所知,只是截断(丢弃小数部分,同时保留整数部分)
    【解决方案5】:

    你的输出是4,因为你声明了int zz 将始终为 int 类型。

    即使表达式x+ydouble 类型,因为ydouble,此表达式也会隐式转换为int,因为您尝试将int 分配给int

    检查此代码:

    #include <stdio.h>
    
    int main()
    {
        int x = 4;
        double y = 5;
        int z = x+y;
    
        printf( "%d %d \n", sizeof(z), sizeof( x + y ) );
        return 0;
    }
    

    输出将是 4 8,因为 z 的类型为 int,而表达式 x+y 的类型为 doubleExample

    【讨论】:

    • 怎么能说x+y类型为double的表达式,是什么意思??!!
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2011-10-15
    • 2011-10-06
    • 2011-07-03
    相关资源
    最近更新 更多