1.共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
2.当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度(以字节byte为单位,一个byte是8个二进制位)为联合中最长的数据类型长度的整数倍,例如
union foo
{
char s[10];
int i;
};
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
3.综上可知,你定义共同体实际在内存中分配的空间是4个byte,因为long数据类型长度是4个byte,而char 字符型数据类型是一个byte,实际在内存中分配的空间示意图
0000 0000(4,最高位)
0000 0000(3)
0000 0000(2)
0000 0000(第一个byte,最低位)
4.于是s->i[0]=0x39;,实际占用的是第一个和第二个byte,实际存放方式是:
0 x (2)(16进制,一个字符需要四个2进制位,这个地方有点忘了具体怎么转换的了)
0010 0111(1),
s->i[1]=0x38;占用第三个和第四个个byte,实际存放方式是:
0 x (4),
0010 0110(3),
,于是,最后输出结果是39,因为s->c[0]指向第一个BYTE(字符型char只占一个byte)
5.如果对共同体还不是很了解,你可以看一下
一楼有些地方有误。
short类型的变量占2个字节,1个字节占8个bit位,所以s->i[0]=0x39,内存中的二进制值应该是
1字节 2字节
00111001 00000000
然后s->i[1]=0x38,内存中的值为:
3字节 4字节
00111000 00000000
而一个char类型的变量只占1个字节,所以字符数组C中的值的对应情况应该是
c[0] = 00111001
c[1] = 00000000
c[2] = 00111000
c[3] = 00000000
所以输出c[0]的值就是00111001,转换成16进制就是39(%x的意思就是16进制显示)
c[1]的值就是00000000,转换成16进制就是0
c[2]的值就是00111000,转换成16进制就是38
c[3]的值就是00000000,转换成16进制就是0
因为它是存储在一个地址下的
s->i[0] s->c[0]是同一个内存中的东西,当然一样
希望有用,我也是略懂点
共用体:几个变量共用一个内存位置
同一时间只能存储其中一个变量的值
*s占用四个字节
s->i[0]=0x39; s->i[1]=0x38 因为i[2]是short型所以i[0] i[1]占用4个字节
一个字节占8个bit位 0x38 转换为二进制为0011 1001 这是第一个字节
i[0]占用两个字节 0x39只填充了第一个字节 所以第二个字节自动补 0000 0000
同理 第三个字节 0x38 0011 1000 第四个字节自动补0000 0000
s->c[0]指向第一个字节 所以是39
我这样对吗 这和大小端序有关系吗