1.首先回忆结构体

我们都知道定义一个结构体可以这样的方式定义:

struct Point {float x;float y;
} point;                      //等价于: struct  Point  point;

除此之外,如果不想声明结构体,只想定义结构体的话,还可以这样:

struct  {float x;float y;
} point;                      //等价于:  struct  Point  point;

2.位域之简单应用

做低层时,经常会读写寄存器,比如操作某位,设置为0或1,而在C语言中便为我们提供一种数据结构”位域”,使得我们通过读写”位域”来实现操作某位.

例如一个常见的位域的结构体,操作如下所示:

#include <stdio.h>struct {                                                  unsigned mode:8;          //bit[0,7]:模式选择unsigned en:1;            //bit[8]   :使能选择unsigned reserved:1;      //bit[9]    :保留reserved  (也可以写成unsigned reserved:1;)unsigned clk_select:4;    //bit[10,13]:时钟选择unsigned ch_select:3;     //bit[14,15]:通道选择
}reg11;            //定义一个reg11变量,不声明结构体的好处在于确保变量唯一性int main()
{      reg11.en =1;                     //bit8=1 --> 256printf("reg11=%d\n",reg11);         //打印 256
reg11.mode =50;printf("reg11=%d\n",reg11);         //打印 256+50return 0;
}

打印:

3.位域之越界处理

比如,我们定义的某个位域只有固定1位,如果向该位写入超过1位的值.会自动保留最低1位.

示例:

#include <stdio.h>
struct {                                                  unsigned mode:8;          //bit[0,7]:模式选择unsigned en:1;            //bit[8]   :使能选择unsigned reserved:1;      //bit[9]    :保留reserved(也可以写成unsigned reserved:1;)unsigned clk_select:4;    //bit[10,13]:时钟选择unsigned ch_select:3;     //bit[14,15]:通道选择
}reg11;     //定义一个reg11变量,不声明结构体的好处在于确保变量唯一性int main()
{     reg11.en =1;                     //bit8=1 --> 256printf("1st:reg11=%d\n",reg11);  //打印 256reg11.en =5;                     //5(b'101) 保留低1位: b'1printf("2st:reg11=%d\n",reg11);  //打印 256
reg11.en =6;                     //5(b'110) 保留低1位: b'0printf("3st:reg11=%d\n",reg11);  //打印 0return 0;
}

打印:

4.注意, 使用位域的结构体的长度默认最小值为int型(4字节),如果超过4字节(32位),则会是64

示例:

#include <stdio.h>struct {unsigned a:4;unsigned b:2;unsigned c:1;
}reg1;        //位域总长度只有7位struct reg{unsigned a:4;unsigned b:2;unsigned c:32;
}reg2;int main()
{      printf("%d\n",sizeof(reg1));printf("%d\n",sizeof(reg2));return 0;
}

打印:

5.如果某个寄存器只有8位(1字节),该如何使用位域处理?

使用union联合体,使各字段共享一块内存,通过读写union结构体里的char变量即可.

示例:

#include <stdio.h>typedef union{
unsigned char val;struct {                                                  unsigned a:4; unsigned b:1; unsigned c:2;unsigned d:1;}bit;       }reg11;             //使用typedef ,告诉编译器,reg11是个声明类型int main()
{      reg11 reg;printf("sizeof=%d\n",sizeof(reg.val));reg.val=0;reg.bit.b = 1;            //bit[4]=1printf("val = %d\n",reg.val);return 0;
}

打印:

6.如果想定义并初始化

示例:

typedef struct {unsigned OVL     :6;unsigned OVOLCN :2;
}rg11;
rg11 reg = {57,1};            //初始化reg变量  OVL=57   OVOLCN=1 

C- unsigned :1之位域分析相关推荐

  1. unsigned int OS_CPU_SR_Save(void)分析

    文章目录 说明: 说明: 在操作系统内核代码里,进入.退出临界代码如下: unsigned int OS_CPU_SR_Save(void);void OS_CPU_SR_Restore(unsign ...

  2. nginx源码分析--内存对齐处理

    1.nginx内存对齐主要是做2件事情: 1) 内存池的内存地址对齐: 2) 长度按照2的幂取整.因为前面结构体已经是对齐了,如果后面的内存池每一小块不是2的幂,那么后面的就不能对齐 2.通用内存对齐 ...

  3. Libevent源码分析-----连接监听器evconnlistener

    出处:http://blog.csdn.net/luotuo44/article/details/38800363 使用evconnlistener: 基于event和event_base已经可以写一 ...

  4. C++ bit field 位域/位段

    " 位域 " 或 " 位段 "(Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作.这种数据结构的一个好处是它 ...

  5. C语言 | 位域的使用详解

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 位域的概念 有些数据在存储时并不需要占用一个完整的字节,只需要 ...

  6. 基于arm64的linux kernel cpu 初始化分析

    从start_kernel开始分析 init/main.cstart_kernel|smp_setup_processor_id|setup_arch|setup_nr_cpu_ids|setup_p ...

  7. 3W字带你C语言入门即精通-最新更新截至5.22

    ** 如有错误,感谢指正** 如有错误,感谢指正,请私信博主,有辛苦红包,拜"一字之师". 请根据目录寻找自己需要的段落 多看手册!!! 写代码的过程 编写: 程序员写代码的过程 ...

  8. C语言笔记(小白发给自己看的)

    比较数字大小 第一种: int main() {int num1;int num2;scanf("%d%d",&num1, &num2);if(num1>nu ...

  9. c语言字母表关键字,读书笔记-C语言关键字

    001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内 ...

最新文章

  1. 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
  2. List字符串数组如何去重
  3. 淘宝api 登录验证
  4. Vue3、TypeScript 实现图片数量及大小随宽度自适应调整
  5. [Matlab] 变量名与字符串的互相转换的正确方法
  6. 企业服务器上病房床号修改,关于医院病房安放陪护床(共享陪护床)申请报告...
  7. flutter 微信语言选择_flutter实战项目,教你使用flutter打造微信app页面!
  8. 风格化图像_【开源】图像风格化和目标检测
  9. 离线人脸识别C#类库分享 虹软2.0版本
  10. Effective STL中文版 译序
  11. Java并发编程实战——并发编程的优缺点
  12. c语言中输出最大公约数和最小公倍数,c语言求最大公约数和最小公倍数(转)...
  13. 火端搜索V2.1原始程序
  14. SpringBoot GA/PRE/SNAPSHOT含义
  15. 利用python批量查询企业信息_Python 实现批量查询域名可用性
  16. 《安富莱嵌入式周报》第280期:支持在线仿真编程的网页版电子开发,CAN总线防攻击实现,BigFAT 规范打破了 FAT 每个文件 4GB 的限制
  17. 流利说英语level4_英语流利说懂你英语 Level4 Unit1 Part1 Vocabulary
  18. 简析国内外电商的区别
  19. icp增值电信业务许可证办理条件及流程介绍
  20. 宝贝流量高转化率低怎么办,如何提高宝贝转化率

热门文章

  1. xshell 无法定位输入点_linux基础知识个人总结
  2. 如何让CSS动画中途停止并维持姿态
  3. CSS中Position定位属性的使用
  4. mysql show_db 权限_菜鸟课堂:MySQL权限的详细解答
  5. guava cache reload返回新旧值解析
  6. 【转载】中国煤层气资源量
  7. vb用鼠标实现屏幕绘图
  8. VB选择文件夹并取文件夹名
  9. 用VB如读取内存地址
  10. Linux 内核源代码的结构