隐式类型转换是否更改变量的大小

  • 本文关键字:变量 改变 类型转换 是否 c
  • 更新时间 :
  • 英文 :


例如,

#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字节,为什么不转换为double,并将8个字节的内存作为double。

否,sizeof z将始终是sizeof(int)

当你这样做:

int z = x+y;

x的值将转换为double,因为y是双倍的,但这不会改变xx+y(类型为double)的结果将转换为int,并分配给z

阅读描述代码行为的注释

#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;

}

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

由于您声明z为int,因此它将是int。所有可能的转换都将从任何类型转换为int:

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

相反,x+y的时间值是双倍的,最终转换为int

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

您的输出是4,因为您正在声明int zz将始终是类型int

即使表达式x+y的类型为double(因为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属于double类型。示例

最新更新