四、《MISRA C》学习笔记四(番外:位域及结构体对齐),2022.12.13

四、2022.12.13

  1. 补充知识:位域大神分析的参考链接
    • 什么是位域?
      位就是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;
      }
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值