转自:http://blog.csdn.net/xiao3404/article/details/22276485
2.共用体
2.1共用体的概念
共用体是一种构造类型的数据结构。在一个“共用体”内可以定义多种不同的数据类型,这些变量共享同一段内存,已达到节省空间的目的,共用体内的变量互相覆盖。
定义共用体类型变量的一般形式:
union 共用体名
{
成员表列;
}变量表列;
例如:
- union data
- {
- int i;
- char ch;
- float f;
- }a,b;
可以看见,“共用体”与“结构体”的定义形式相似,但他们的含义不同。共用体的各成员变量在内存中的字节数可能不同,但这些变量都放在从同一个地址开始的内存单元中,共用体变量所占的内存长度等于最长的成员长度。变量在内存中的情况如下:
图 2 union变量内存分布
2.2共用体类型数据的特点
(1)同一个内存段内可以用来存放几种不同的数据类型,但是每一瞬时只能存放其中的一个数据,即每一个瞬时只有一个成员起作用,其他的成员不起作用。
(2)共用体变量中起作用的是最后一次存放的成员,每次只能赋一种值, 赋入新值则冲去旧值。
例如:
- b.ch = 'a';
- b.i = 0x00004241;
- printf("%c",b.ch);//结果:A
(3)共用体变量的地址和它的各成员的地址是同一个地址;
(4)共享内存从union的首地址开始放置,从最低地址开始覆盖
3.加深struct和union的理解
在此之前先简单介绍计算机中的两个术语:
大端模式,是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中。
小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。
在一般情况下x86结构是小端模式,本机就是如此!
- int data = 0x00004241;
在内存中它们存储的方式有两种:
图 3 大端模式
图 4 小端模式
看如下的代码:
输出结果:
- union number /*定义一个联合*/
- {
- int i;
- struct
- {
- char first;
- char second;
- }half; /*在联合中定义一个结构*/
- }num;
- num.i=0x00004241; /*联合成员赋值*/
- printf("%c%c ", num.half.first, num.half.second);
- num.half.first='a'; /*联合中结构成员赋值*/
- num.half.second='b';
- printf("%x ", num.i);
AB
6261
分析与内存变化:
num.i = 0x00004241对应step1,num.half.first = 'a' num.half.second= 'b'对应step2,printf("%x ",num.i)对应step3;由于在我的机器中是小端模式,故四字节的“61620000”代表的十六进制整数是“6261”。
图 5 内存变化过程
4.union中存放的数据类型
1.联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存
2.联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。
5.共享内存特性的几种应用
- union data
- {
- int i;
- unsigned char c[4];
- float f;
- };
- union data a;//定义union类型的变量
1.在需要将浮点数据转移时,使用共同体,按4个字节的char型数据传输,带来通信效率的提高。
一般浮点数发送方法:是将浮点数放大一定的倍数,再取整,再按整数的高低位传输。还需要传输这个放大的倍数,如果浮点数是个负数的话,还要将符号一并发送。接收方收到这几条报文后,才能将数据还原。但是接收方还原的浮点数据与发送方发送的浮点数不一样,因为小数位数发生变化。使用共同体就不会出现这个问题了,在接收方,使用共同体,将收到到的4个char数据赋值给a.c数组,a.f就是还原的数据,这个数据和发送的数据是一样的,也不管发送的浮点数是正还是负。如有a.f = -12.34; 则a.c[0] = 0xa4, a.c[1] = 0x70, a.c[2] = 0x45, a.c[3] = 0xc1。如有a.c[0] = 0xa4, a.c[1] = 0x70, a.c[2]= 0x45, a.c[3] = 0xc1,则a.f =-12.34。使用这种方式传输浮点数,数据是不会丢失的,报文也更简单。
2.将浮点数保存到文件中时,保存为4个字节的char型数据,节约空间。如果保存为文本需要占用的字节数等于数值的字符的个数,有可能占用1~20字节,而用共用 体的char型数据,占用的空间大小固定为4字节,对大量浮点数据的存储,节约的空间更多,分析保存的浮点数也是很方便的。
3.用在强制类型转换上。如将int数据转为float,可以这样使用union: a.i =1234;赋值后,a.f就是转换后的值等于1234。