#include <stdio.h>
// 定义一个联合体
union Data {
int i;
float f;
char c;
char d[40];
};
int main() {
union Data data; // 声明一个联合体变量data
printf("Data len = %d\n", sizeof(data)); // 输出整数成员的值
data.i = 42; // 给联合体的整数成员赋值
printf("data.i = %d\n", data.i); // 输出整数成员的值
data.f = 3.14; // 给联合体的浮点数成员赋值
printf("data.f = %.2f\n", data.f); // 输出浮点数成员的值
data.c = 'A'; // 给联合体的字符成员赋值
printf("data.c = %c\n", data.c); // 输出字符成员的值
// 注意:联合体的不同成员共享同一块内存空间,赋值一个成员会影响其他成员的值
printf("data.i = %d, data.f = %.2f, data.c = %c\n", data.i,data.f, data.c);
//data.i = 1078523201, data.f = 3.14, data.c = A
printf("Data len = %d\n", sizeof(data)); // 输出整数成员的值
return 0;
}
运行结果
标准输出:Data len = 40
data.i = 42
data.f = 3.14
data.c = A
data.i = 1078523201, data.f = 3.14, data.c = A
Data len = 40
如果联合体如下:
// 定义一个联合体
union Data {
int i;
float f;
char c;
};
则运行结果如下:
标准输出:Data len = 4
data.i = 42
data.f = 3.14
data.c = A
data.i = 1078523201, data.f = 3.14, data.c = A
Data len = 4
理解为最大len,也从另一面印证了联合体共用一段内存。
联合体的场景应用:
方法1:
UINT StrLength = 0x12345678; // 原始值
UINT8 BufferTemp[4];
// 小端序(低字节在前,x86架构常用)
BufferTemp[0] = (UINT8)(StrLength); // 0x78
BufferTemp[1] = (UINT8)(StrLength >> 8); // 0x56
BufferTemp[2] = (UINT8)(StrLength >> 16); // 0x34
BufferTemp[3] = (UINT8)(StrLength >> 24); // 0x12
// 大端序(高字节在前,网络传输常用)
BufferTemp[0] = (UINT8)(StrLength >> 24); // 0x12
BufferTemp[1] = (UINT8)(StrLength >> 16); // 0x34
BufferTemp[2] = (UINT8)(StrLength >> 8); // 0x56
BufferTemp[3] = (UINT8)(StrLength); // 0x78
方法2:
UINT StrLength = 0x12345678;
UINT8 BufferTemp;
// 方法 2.1:指针强制转换
UINT8* p = (UINT8*)&StrLength;
for (UINTN i = 0; i < sizeof(UINT); i++) {
BufferTemp[i] = p[i]; // 结果依赖平台字节序
}
// 方法 2.2:联合体(Union)
union {
UINT Integer;
UINT8 Bytes;
} Converter;
Converter.Integer = StrLength;
CopyMem(BufferTemp, Converter.Bytes, 4); // 同样依赖平台字节序