struct和union的存储精确使用
直接见代码 第一次看到这样的代码,真的很神奇,终于知道C语言是怎么操作寄存器的了,本职 嵌入式!
/**********************************************************************
测试功能:主要用于模拟寄存器操作;
操作:寄存器中设置bit,也可以通过all进行一个字节的设置(一般是32bit机型)
Autor: BOBO
**********************************************************************/
#include <stdio.h>
//typedef struct BITS
typedef struct
{
unsigned char b0 : 1;
unsigned char b1 : 1;
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
}BITS;
typedef union
{
unsigned char all;
BITS bit;
}REG_MSG;
int main()
{
REG_MSG m_reg;
printf("=======test20200423=======\r\n");
m_reg.all = 0xAA;
printf("b7:%d\t", m_reg.bit.b7);
printf("b6:%d\t", m_reg.bit.b6);
printf("b5:%d\t", m_reg.bit.b5);
printf("b4:%d\t", m_reg.bit.b4);
printf("b3:%d\t", m_reg.bit.b3);
printf("b2:%d\t", m_reg.bit.b2);
printf("b1:%d\t", m_reg.bit.b1);
printf("b0:%d\t", m_reg.bit.b0);
printf("\n");
printf("------------------------------\r\n");
//重置每一位的值 将all的value变成:0x88 -> bit7 = 1 bit3 = 1
m_reg.bit.b7 = 1;
m_reg.bit.b6 = 0;
m_reg.bit.b5 = 0;
m_reg.bit.b4 = 0;
m_reg.bit.b3 = 1;
m_reg.bit.b2 = 0;
m_reg.bit.b1 = 0;
m_reg.bit.b0 = 0;
printf("ALL: 0x%02X\r\n", m_reg.all);
printf("\r\n------------------------------\r\n");
return 0;
}
前言
1.基本上像是在模拟寄存器的操作一样,如果从事嵌入式软件开发的寄存器操作都知道的;
2.这种操作可以最大化的利用内存;
程序解析
//用union联合体定义unsigned char类型进行的数据
typedef union
{
unsigned char all;
BITS bit;
}REG_MSG;
//此时,REG_MSG调用 all和bit的时候是操作的同一片地址,同样大小的内存;
//下面用struct定义的每一个bit的变量,b0-b7;这同样是struct的一个用法,详情可以自己查找,以b0为例,b0:5; 也就是表示b0占用总字节的5bit;
typedef struct
{
unsigned char b0 : 1;
unsigned char b1 : 1;
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
}BITS;
//这样就可以对一个字节的每一位进行管控了。
//因为union操作的同样内存及存储,则REG_MSG中的all就相当于BITS bit;又因为BITS bit对位进行调控,所以 all <-> b0-b7
如果有什么解释不妥,还请留言,多谢批评指正!