四、2022.12.13
- 补充知识:位域大神分析的参考链接
- 什么是位域?
位就是bit,位域可以理解为不止一个bit的集合,这个集合被赋予一些意义 - 为什么要用位域?
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种数据结构,叫做“位域”或“位段 - 位域的应用实例:
寄存器的封装:如32位寄存器,每8位代表某一方面的设置,那么可以按照如下的方式对寄存器进行封装:struct Register_BITS{ uint32_t VERID:8; // 0-7 uint32_t RCCR:8; //8-15 uint32_t VCCR:8; //16-23 uint32_t HCCR:8; //24-31 }SCG_Type,*SCG_MemMapPtr; SCG_Type * base; base.VERID = 01100110; ...
- 引申出内存对齐的问题,在32位系统中,内存4字节对齐
struct pack { unsigned a:12; //独占4个字节 unsigned b:24; //b与c占用a所占的下一个字节,因为12+24=36bit,超出了4字节 unsigned c:6; };
- 结构体的内存对齐,详细分析可以参考文章开头的链接
#include <stdio.h> typedef struct Test { char a1; int a2; char a3; short a4; }Test_T; int main(void) { Test_T T; printf("\nsizeof(T) = %d\n", sizeof(T)); //12 printf("a1:%d\n", &T.a1); //2293316,独占4字节,a1仅占32个bit中的头8个 printf("a2:%d\n", &T.a2); //2293320,独占4字节,a2占满32个自己 printf("a3:%d\n", &T.a3); //2293324,占2293324这个地址的8个bit printf("a4:%d\n", &T.a4); //2293326,占2293326/7这两个byte的16个bit //a3和a4之间的1个byte空置,确保4字节对齐 return 0; }
- 什么是位域?