C 联合数据存储的工作原理。获得令人困惑的输出

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; }; 联

我无法理解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;
};
联合价值观;
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的具体疑问的这个答案来说,这将是一个很难回答的问题。”。