联合体中的所有成员共用一块内存区域,这个区域的长度取决于占用空间最长的成员
看代码效果,比较直观
/*
* arr 和 addr共用一块空间,空间长度为32bit
* 如果arr类型是uint16_t,那么此空间长度就是16*4=64(bit)
*/
struct addr {
union {
uint32_t addr;
uint8_t arr[4];
};
};
/**
* union中的struct和addr共用一块空间,struct用__packed对齐修饰,长度为8bit
* struct中成员a,b,..每个占用1bit,8个打包成一个就是8bit(1byte)长度
*/
struct flash {
union {
struct {
unsigned char a:1;
unsigned char b:1;
unsigned char c:1;
unsigned char d:1;
unsigned char e:1;
unsigned char f:1;
unsigned char g:1;
unsigned char h:1;
} __attribute__((packed));
uint8_t addr;
};
};
int main()
{
struct addr x;
struct flash z;
z.addr = 0x77;//01110111 (8bit)
x.addr = 0x12345678;// (32bit)
printf("%d%d%d%d%d%d%d%d", z.a, z.b, z.c, z.d, z.e, z.f, z.g, z.h);
//打印出每个bit位成员的值,结果:11101110, z.a为低位,z.h为高位
printf("%02x%02x%02x%02x", x.arr[0], x.arr[1], x.arr[2], x.arr[3]);
//打印数组值x.arr[0]为低位,x.arr[3]为高位,结果:78563412
return 0;
}
刚好利用此特性解决了代码的冗余,比如每次读写32位寄存器,32位地址要用数组的方式传进去,此时就可直接一次赋值32bit位(x.addr = 0x12345678),然后用联合体取到每个byte的值(x.arr[2] = 0x34)
以上.