1. 联合体的定义
联合体在C中比较常用,它不像结构体一样,每个成员占用各自的存储空间,相互不影响,它的所有成员占用同一段内存空间,修改一个成员影响其它所有成员。联合体的定义和使用与结构体一样。
2. 联合体的应用
(1)判断大小端
union IsLittle_Endian{
int a;
char c;
};
union IsLittle_Endian un;
un.a =1;
if(un.c == 1)
{
//小端
}
else
{
//大端
}
(2)数据的拆分与组合
这个经常在通信协议代码中用的比较多,比如数据解析与发送。
union bit32_data
{
uint32_t data;
struct
{
uint8_t byte0;
uint8_t byte1;
uint8_t byte2;
uint8_t byte3;
}byte;
};
union bit32_data num;
if(数据拆分)
{
num.data = 0x12345678;
//num.byte.byte0 = 0x78;
//num.byte.byte1 = 0x56;
//num.byte.byte2 = 0x34;
//num.byte.byte3 = 0x12;
}
else if(数据组合)
{
num.byte.byte0 = 0x78;
num.byte.byte1 = 0x56;
num.byte.byte2 = 0x34;
num.byte.byte3 = 0x12;
//num.data = 0x12345678;
}
(3)结构体与缓冲区
这种应用也是常应用与通信协议组包与发送过程,
union SendOrRev_data
{
unsigned char Buffer[8];
struct
{
unsigned char data1;
unsigned char data2;
unsigned char data3;
unsigned char data4;
// ...
}data;
};
Struct里的内容可以是单一数据,也可以是协议帧各个字段,比如校验和等。如果我们要发送数据,我们可以操作结构体,填充结构体,最后发送的时候把Buffer传给发送函数即可;如果我们是接收,我们就把接收的数据存放在Buffer中,然后使用结构体解析数据和使用数据。
(4)传输浮点数据
union float_data
{
float f;
struct
{
unsigned char byte[4];
};
};
我们在协议传输数据时,常常要传输浮点数据,我们可以使用专用的工具转换,但是直接用这个技巧更加方便,可以把一个float数据拆分为四个字节,操作结构体就可以发送或接收这四个字节,只是要主要高低字节序。