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
(typedouble
)的结果将转换为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;
}