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

C 隐式类型转换是否会更改变量的大小,c,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; } #包括 内部主(空){ int x=5; 双y=6; intz=x+y; printf(“z的大小=%d字节”,sizeof(z)); 返回0; } 输出是4字节,为什

比如说,

#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;
}
#包括
内部主(空){
int x=5;
双y=6;
intz=x+y;
printf(“z的大小=%d字节”,sizeof(z));
返回0;
}

输出是4字节,为什么不转换为double并将8字节的内存作为double。

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

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

当您这样做时:

int z = x+y;
x
的值将转换为
double
,因为
y
是double,但这不会改变
x
。而
x+y
(type
double
)的结果将转换为
int
,并分配给
z
,,因为您声明z为int,所以它将是int。并且每个可能的转换都将从任何类型转换为int:

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

阅读描述代码行为的注释

#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;
#包括
内部主(空){
int x=5;
双y=6;
int z=x+y;//5(int,4字节)+6(double,8字节)
//添加时将'int'转换为'double'()
//5.0(双精度,8字节)+6.0(双精度,8字节)
//11.0(双精度,8字节)
//但是!`z`的类型是`int`,因此它不会转换为`double``
//然后11.0转换为11,因为'z`……是'int'类型!
///读一下“双精度浮点格式”,你就会明白为什么了。
//因此,z=11(`z`是`int`类型,所以它的大小是*4*字节)
//这是您的4个字节,而不是8!;)
printf(“z的大小=%d字节”,sizeof(z));
返回0;

}

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

即使表达式
x+y
的类型为
double
,因为
y
double
,此表达式也会隐式转换为
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;
}
#包括
int main()
{
int x=4;
双y=5;
intz=x+y;
printf(“%d%d\n”,sizeof(z),sizeof(x+y));
返回0;
}

输出将是
48
,因为
z
类型为
int
,表达式
x+y
类型为
double

因为它是一个
int
z
将不会转换为
double
。而且您的
printf
格式不正确。它应该是
%zu
,因为
sizeof
的类型是
size\u t
,并且应该在末尾包含一个
\n
。发布问题的人说:“输出是4字节,为什么不转换为双字节,并将8字节的内存作为双字节。”。。你想回答什么?我的意思是提问者说他收到了4个字节的输出。。。为什么不是8字节。。他想知道为什么输出是4字节。。。您正在解释为什么它是8字节。。再次仔细阅读问题。有两种类型的类型转换:隐式和显式。。隐式:转换是从高到低,这就是这里发生的。。在显式模式下,转换由低到高:编译器不会自动执行。。因此,在这个程序中,转换是自动的=隐式的=从double到int..@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)你说过x会被转换成双倍,但这不会改变x,怎么办@YuHao@ArmiaWagdy:注意
x
的值仅在表达式中提升为
double
,这并不意味着
x
本身包含在
double
中,C/C++是“静态类型语言”(与“动态类型语言”如Python相比),这意味着变量的类型不能更改。同时尝试
sizeof(x+y)
您将得到==
sizeof(double)
@ArmiaWagdy您可能想读:@YuHao对,当5升级为double时,它将是5.0,它将如何保存在内存中?例如,5将是00000101。5.0将是什么?很抱歉foll@ArmiaWagdy谷歌关于左值和右值的区别,那应该是有帮助的。你怎么能说x+y的表达式的类型是double,这是什么意思??!!当变量x升级为double时,它是否需要64字节而不是32字节。如果不是,编译器如何处理这种隐式转换?据我所知,只需截断(丢弃分数部分,同时保留整数部分)
#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;
}