共用体的赋值问题
2018年11月15日 11:40:58 layandtry 阅读数:55
注:带颜色的文本是转发者添加的内容
共用体的内存虽然有自己的成员变量,但是所有成员变量占用的是同一段内存空间。
对于共同体变量,在某一时间点上只能存储某一成员的信息
#include<stdio.h>
union un
{
int i;
char c[2];
};
void main()
{
union un x;
x.c[0]=10;//它的赋值本质是在4个字节(因为有int i;语句,已经将i开辟了4个字节的空间)的空间里的左边第一个字节存放整
//型数10,即在???? ???? ???? ???? ???? ???? ???? ????的最后一个字节即红色?表示一个字节,赋值为10,
//为什么上面的4个字节是问号呢?因为变量i没有赋值,是随机数。当完成x.c[0]后,变成了:
//???? ???? ???? ???? ???? ???? 0000 1010,
x.c[1]=1;//此句赋值完后,4个字节的空间变成了:???? ???? ???? ???? 0000 0001, 0000 1010,紫色的部分就是本句代码的
//作用。因此当访问变量i时,访问的是上面4个字节的值:???? ???? ???? ???? 0000 0001, 0000 1010,因为这4 //个字节中前面的两个 字节没有赋值,所以是不固定的数,也就是随机数,每次访问变量i时,都会出现不一样的数
//值。但是每次访问后2个字节的空间时,都不会变化,都是:左边第一个字节的是是10,即x.c[0],第二个字节的值是1,
//即x.c[1]的值。所以说在没有给前两个字节赋值为0的情况下,下面运行结果的说法都是不对的。怎样做下面的说法
//才正确呢?就是在前面加上一句代码:int i = 0;将最前面的两个字节变为0后,就与下面的说法相符了。
printf("\n%d",x.i);//
printf("\n%d",x.c[0]);//结果是10
printf("\n%d",x.c[1]);//结果是1
}
运行结果是266 10 1
刚开始一脸懵逼,后来带入数值不断的运行之后,
1. 当x.c[0]=10; x.c[1]=2;
运行结果为522=2*256+10
2 . 当x.c[0]=10; x.c[1]=3;
运行结果为778=3*256+10
3. 当x.c[0]=10; x.c[1]=0;
运行结果为10=0*256+10
4. 当x.c[0]=11; x.c[1]=1;
运行结果为10=267
5. 当x.c[0]=12; x.c[1]=1;
运行结果为10=268
也就是说,x.c[1]是十六进制的十位(应该是十六进制的百位),x.c[0]是个位。