C 联合数据存储的工作原理。获得令人困惑的输出
我无法理解Union是如何打印数据的C 联合数据存储的工作原理。获得令人困惑的输出,c,union,C,Union,我无法理解Union是如何打印数据的 #include<stdio.h> int main(){ union Values{ int a; char b; int c; }; union Values val; val.a = 1; val.b= 2 ; val.c = 300; printf("%d,%d,%d",val.a,val.b,val.c); return 0; } #包括 int main(){ 联合价值观{ INTA; 字符b; INTC; }; 联
#include<stdio.h>
int main(){
union Values{
int a;
char b;
int c;
};
union Values val;
val.a = 1;
val.b= 2 ;
val.c = 300;
printf("%d,%d,%d",val.a,val.b,val.c);
return 0;
}
#包括
int main(){
联合价值观{
INTA;
字符b;
INTC;
};
联合价值观;
val.a=1;
val.b=2;
val.c=300;
printf(“%d,%d,%d”,val.a,val.b,val.c”);
返回0;
}
我得到300,44300
值的输出
是大小int
的联合类型,这是其成员的最大大小
考虑到int
的大小是4个字节,那么
+------------+-------------+-------------+-------------+
union Values val = | 1st byte | 2nd byte | 3rd byte | 4th byte |
+------------+-------------+-------------+-------------+
你什么时候去商店
val.c = 300; //binary 0b100101100
val
将变为
+------------+-------------+-------------+-------------+
val = | 0010 1100 | 0000 0001 | | |
+------------+-------------+-------------+-------------+
当您访问val.b
时,您将只读取包含0010 1100
的一个字节。
而
00101100
的十进制等价物是44
一个union
不能同时容纳这三个。如果您想存储所有这些内容,您是否打算制作一个struct
?将代码中的两个union
更改为struct
,看看您是否更喜欢这个结果。Me认为您需要阅读此内容,可能重复,不清楚您混淆了什么。您是否希望val.a
、val.b
和val.c
都保留其值?这几乎与工会的目的相反。如果您希望val.a
、val.b
和val.c
都保留它们的值,那么您需要的是一个struct
。一个联盟的全部意义在于它的规模足以容纳其中一种价值观;它们在记忆中相互重叠。可以从联合中获取的唯一值是存储在联合中的最后一个值。每当您在并集中存储新值时,它将覆盖所有或部分其他值。int
和int
之间的并集没有意义。为了回答这个问题,您必须考虑endianess。您似乎假设了大端,但OP使用的是小端。@Lundin根据您的建议进行了更新!谢谢。“这是其成员的最大规模。”--><代码>联合值{double a;char b[9];}“代码>可能仍然需要对齐填充。@chux我也希望涵盖这一点,但对于涵盖OP的具体疑问的这个答案来说,这将是一个很难回答的问题。”。