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

打印:

3.位域之越界处理

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

示例:

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

打印:

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

示例:

#include <stdio.h>

struct {
unsigned a:;
unsigned b:;
unsigned c:;
}reg1;        //位域总长度只有7位 struct reg{
unsigned a:;
unsigned b:;
unsigned c:;
}reg2; int main()
{
printf("%d\n",sizeof(reg1));
printf("%d\n",sizeof(reg2));
return ;
}

打印:

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

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

示例:

#include <stdio.h>

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

打印:

 方法2-直接定义为unsigned char

示例:

struct reg{
unsigned char a:;
unsigned char b:;
unsigned char c:;
}; //位域总长度只有7位 int main()
{
printf("%d\n",sizeof(reg));
return ;
}

打印:

6.如果想定义并初始化

示例:

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

C- unsigned :1之位域分析的更多相关文章

  1. C 结构体位域

    位域 : 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一 ...

  2. C结构体之位域(位段)

    C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C ...

  3. C++中的位域(bit-filed):一种节省空间的成员

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html 有一种被称为位域(bit-field) 的特殊的类数据成员,它可以被 ...

  4. 【转】C/C++位域结构深入解析

    C/C++位域结构深入解析 内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节.然而,在解决某些问题时,必须要有二进制层面的表达手段(见本博客的自己动手实现DNS协议 ...

  5. c语言位域的使用注意事项——数据溢出

    c语言可以使用位域来节省变量的空间,例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.位域的取值范围非常有限,数据稍微大些就会发生溢出,这个字使用keil的使用,keil提 ...

  6. C位域操作

    位域的概念 1个字节包含8位,有些变量保存的数据不需要占用这么长的空间(比如bool类型,只有两个状态true和false, 1位就可以搞定,剩下的7位就浪费了),这就催生了“位域”结构,位域将1个字 ...

  7. 经典C面试真题精讲

    第一章 灵魂--指针 101. p++ 请分析下述代码的输出结果 int main() { char* p1 = "China"; char* p2, * p3; p2 = (); ...

  8. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  9. 深入理解计算机系统家庭作业汇总 20135301&&20135328

    深入理解计算机系统家庭作业 深入理解计算机系统第二章家庭作业 题目2.64 题目要求 判断二进制数偶数位是否有任意一位位为1,有的话返回1,否则返回0 解题过程 int any_even_one(un ...

随机推荐

  1. 制作系统U盘

    没有任何宣传软件成分昂,我就是这做的. 1.在百度搜索上搜索“通用PE大师”,点开了这个网站http://up.6615261.cn/index.html,打开之后如下图,下载这个二合一版本 2.在电 ...

  2. Android插件化的兼容性(下):突破Android P中灰黑名单的限制

    在Android P系统中,加入了访问私有API接口的限制.

  3. Key-Value 数据库简介

    1.Aerospike 官方网站:https://www.aerospike.com/ Aerospike是一个以分布式为核心基础,可基于行随机存取内存中索引.数据或SSD存储中数据的数据库. Aer ...

  4. 埃航和737MAX坠毁:软件优先级问题

    事件背景: 2019年3月10日,埃塞俄比亚航空公司一架波音737MAX8飞机发生坠机,机上157人全部遇难,包括8名中国公民.这是继去年10月29日印尼狮航空难事故之后,波音737MAX8飞机在五个 ...

  5. Python - Fabric简介

    1 - Fabric Fabric是一个Python的库,提供了丰富的同SSH交互的接口,可以用来在本地或远程机器上自动化.流水化地执行Shell命令. 非常适合用来做应用的远程部署及系统维护.简单易 ...

  6. 关于在vscode中以https方式请求!不是以file文件夹访问!vscode中 ajax请求

    在vscode 头疼的问题是 用浏览器查看网页!会是以文件夹的方式打开的!  我遇到这个问题 我还重新配置了Apache    ! 但是现在可以解决: 使用vscode  ============== ...

  7. 【app】Appium日志文件分析

    Appium在和客户端及手机端进行通讯的时候会输出很多日志,可以通过点击主面板的Get Raw Logs得到其原始日志: 现在我们另存到其他路径,并且以notepad工具打开进行查看 Appium日志 ...

  8. 性能瓶颈之Session

    如果Source,Target和Mapping都不存在性能上的瓶颈,则问题可能会出在Session 以下问题可导致Session有性能上的瓶颈 1) 缓存小 2) 缓冲内存小 3) commit提交间 ...

  9. Mac-Navicat Premium For Mac 12 破解 - [数据库可视化工具,亲测完美破解]

    一.下面的公钥和私钥暂时存到文本编辑器中 公钥: -----BEGIN PUBLIC KEY-----MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB8vXG0I ...

  10. .Net RabbitMQ系列之环境搭建于RabbitMQ基本介绍

    本系列主要讲解RabbitMQ在.Net环境下的应用,由于Linux环境下,本人Linux功力有限,所以本系列的RabbitMQ跑在Windows环境中.所以的配置之类都在Windows环境中进行. ...