在学习C语言时,知道union类型是联合类型,各字段共享一块内存,实际应用中却不知道它的具体用途。下面列出目前我知道的3种应用场景。
实际应用1--数据类型转换
typedef union {
uint32_t ivalue;
float fvalue;
} setting_limit_t;
实际应用2--数据的拆分和合并
typedef union{
uint32_t u;
uint8_t bytes[4];
}asBytes composite;
实际应用3--共用内存空间
这应该是此关键字最初的设计用途,虽然现代计算机内存空间已经相对‘富足’,但在单片机(MCU)开发中使用过多的内存可能会带来物料成本的上升,所以内存的使用还是能省则省。 这是一个试题:假设网络节点A 和网络节点B 中的通信协议涉及四类报文,报文格式为“报文类型字段+报文内容的结构体”,四个报文内容的结构体类型分别为STRUCTTYPE1~ STRUCTTYPE4,请编写程序以最简单的方式组 织一个统一的报文数据结构。 分析: 报文的格式为“报文类型+报文内容的结构体”,在真实的通信中,每次只能发四类报文中的一种,我们可以将四类报文的结构体组织为一个union(共享一段内存,但每次有效的只是一种),然后和报文类型字段统一组织成一个报文数据结构。
typedef unsigned char BYTE;
//报文内容联合体
typedef union tagPacketContent
{
STRUCTTYPE1 pkt1;
STRUCTTYPE2 pkt2;
STRUCTTYPE3 pkt1;
STRUCTTYPE4 pkt2;
}PacketContent;
//统一的报文数据结构
typedef struct tagPacket
{
BYTE pktType;
PacketContent pktContent;
}Packet;