C- unsigned :1之位域分析
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之位域分析相关推荐
- unsigned int OS_CPU_SR_Save(void)分析
文章目录 说明: 说明: 在操作系统内核代码里,进入.退出临界代码如下: unsigned int OS_CPU_SR_Save(void);void OS_CPU_SR_Restore(unsign ...
- nginx源码分析--内存对齐处理
1.nginx内存对齐主要是做2件事情: 1) 内存池的内存地址对齐: 2) 长度按照2的幂取整.因为前面结构体已经是对齐了,如果后面的内存池每一小块不是2的幂,那么后面的就不能对齐 2.通用内存对齐 ...
- Libevent源码分析-----连接监听器evconnlistener
出处:http://blog.csdn.net/luotuo44/article/details/38800363 使用evconnlistener: 基于event和event_base已经可以写一 ...
- C++ bit field 位域/位段
" 位域 " 或 " 位段 "(Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作.这种数据结构的一个好处是它 ...
- C语言 | 位域的使用详解
1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 位域的概念 有些数据在存储时并不需要占用一个完整的字节,只需要 ...
- 基于arm64的linux kernel cpu 初始化分析
从start_kernel开始分析 init/main.cstart_kernel|smp_setup_processor_id|setup_arch|setup_nr_cpu_ids|setup_p ...
- 3W字带你C语言入门即精通-最新更新截至5.22
** 如有错误,感谢指正** 如有错误,感谢指正,请私信博主,有辛苦红包,拜"一字之师". 请根据目录寻找自己需要的段落 多看手册!!! 写代码的过程 编写: 程序员写代码的过程 ...
- C语言笔记(小白发给自己看的)
比较数字大小 第一种: int main() {int num1;int num2;scanf("%d%d",&num1, &num2);if(num1>nu ...
- c语言字母表关键字,读书笔记-C语言关键字
001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内 ...
最新文章
- 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
- List字符串数组如何去重
- 淘宝api 登录验证
- Vue3、TypeScript 实现图片数量及大小随宽度自适应调整
- [Matlab] 变量名与字符串的互相转换的正确方法
- 企业服务器上病房床号修改,关于医院病房安放陪护床(共享陪护床)申请报告...
- flutter 微信语言选择_flutter实战项目,教你使用flutter打造微信app页面!
- 风格化图像_【开源】图像风格化和目标检测
- 离线人脸识别C#类库分享 虹软2.0版本
- Effective STL中文版 译序
- Java并发编程实战——并发编程的优缺点
- c语言中输出最大公约数和最小公倍数,c语言求最大公约数和最小公倍数(转)...
- 火端搜索V2.1原始程序
- SpringBoot GA/PRE/SNAPSHOT含义
- 利用python批量查询企业信息_Python 实现批量查询域名可用性
- 《安富莱嵌入式周报》第280期:支持在线仿真编程的网页版电子开发,CAN总线防攻击实现,BigFAT 规范打破了 FAT 每个文件 4GB 的限制
- 流利说英语level4_英语流利说懂你英语 Level4 Unit1 Part1 Vocabulary
- 简析国内外电商的区别
- icp增值电信业务许可证办理条件及流程介绍
- 宝贝流量高转化率低怎么办,如何提高宝贝转化率