19_09_13 关于c语言中位域的理解

(27)FPGA实现AD7768接口(六) AD7768/AD7768-4 为8通道和4通道24位同步采样模数转换器(ADC)。通过可选的功耗模式和数字滤波器选项可重新配置AD7768/AD7768-4以适应多种应用,如工业输入/输出模块、仪器仪表、音频测试、控制回路和状态监控。FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。 阅读详情

在实际接触的C语言项目中,我们会发现很多时候都用到了位域。初次听到时可能有些模糊,但其实是很好理解的,以下是经过参考各类资料和大牛的说法后本人对位域的一些理解。
如有问题,欢迎告知,感谢之至。

1.什么是位域?

简单的理解,就是“按位存储”。
实际在c语言中,不同的编译器下,我们对各种类型的变量进行不同字节的存储。百度百科对字节是这么说明的:最常用的字节是八位的字节,即它包含八位的二进制数。(有兴趣的小伙伴们可以自行了解)。这里可简单理解为基本上每个字节都是占8位。
但是有时候我们所需要使用的位数并不需要那么多,比如:开关变量我们设置开为1,关为0,其实只要用一位二进制位就能够实现。因此为了节约存储空间和使处理起来方便。我们便把一个字节分开来,形成不同大小的位域,每个位域有一个域名。这样就可以实现将不同的对象用一个字节来存储。

2.怎么定义位域?

位域的定义类似于结构体的定义(好几种,可参考结构体的定义及声明)。
结构体的一种定义形式为:
struct 结构体名
{
结构体成员列表;
};

类似于此,位域也可定义为:
struct 位域名
{
位域列表;
};

位域列表的定义形式为:
类型说明符 位域名:位域长度;
需要注意的是,位域名后面用“:”(冒号)

3.一个字节中各个位域的位置顺序?

即我们在同一个字节里定义位域的时候,是按照从低到高位,还是从高到低位来存储的呢?我们来做一个实验。

#include<stdio.h>
union o{
		struct{
			unsigned char a1:2;
			unsigned char a2:2;
			unsigned char a3:2;
			unsigned char a4:2;
		}in;
		unsigned char test;
	}out;
	
int main(){
	out.test=228;     //二进制为11100100
	printf("a1:%d\n",out.in.a1);
	printf("a2:%d\n",out.in.a2);
	printf("a3:%d\n",out.in.a3);
	printf("a4:%d\n",out.in.a4);
	printf("size:%d\n",sizeof(out));
	return 0;
} 

在联合体out内定义结构体in和变量test,使他们在同样内存里存储。设置无符号char型变量test值为228,其二进制数为11100100,然后分别输出:
在这里插入图片描述
发现对应关系如下:

进制a4a3a2a1
十进制3210
二进制11100100

也就是说,按照我们定义的顺序,再同一个字节里面,是从低位到高位开始存储的。1

4.跨字节位域的存储?

在当前字节所含位数少于我们所需要的位数时,又是怎么存储的呢?我们先来看两段段代码:

#include<stdio.h>
struct ab{
	unsigned char a:2;
	unsigned char b:4;
}aa;
;
int main(){
	printf("%d\n",sizeof(aa));
	return 0;
} 

这是我们在同一个字节里未超出一个字节时,输出是:
在这里插入图片描述

#include<stdio.h>
struct ab{
	unsigned char a:2;
	unsigned char b:4;
	unsigned char c:4;
	
}aa;
;
int main(){
	printf("%d\n",sizeof(aa));
	return 0;
} 

这是超过了一个字节所含位数时,输出是:
在这里插入图片描述
可以发现,当当前的字节存不下时,会从下一个字节开始。且字节大小为位域中最长字节的整数倍。
为了更好理解,当我们把代码改成如下时:

#include<stdio.h>
struct aa{
	unsigned char a:2;
	unsigned char b:4;
	unsigned int c:4;
}aa;
int main(){
	printf("%d\n",sizeof(aa));
	return 0;
} 

会出现这样的结果:
在这里插入图片描述
这是为什么呢?其实,与结构体类似,位域也需要遵循内存对齐的原则。我们首先考虑类型所占用的字节,总的字节大小是最大对齐数的整数倍,所以是4的整数倍。然后才考虑实际每个字节里面具体位域分布(关于结构体的内存对齐感兴趣的可以自行了解)。


  1. 参考地址:https://www.cnblogs.com/maowang1991/p/3656072.html ↩︎

05 - matlab m_map地学绘图工具基础函数 - 设置比例尺指北针 本篇介绍下m_map中添加指北针(m_northarrow)、比例尺(m_ruler)和进行比例缩放(m_scale)的函数及其用法 。提供了 示例以便参考,罗列了 各函数可设属性。希望对绘图的你有所帮助。 阅读详情

相关推荐

【数电课程设计】---出租车计价器

文章目录1、任务要求2、方案3、收获 1、任务要求 2、方案 3、收获

LZY 1万+

位域——C

位域的定义和规定 有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。 在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。请看下面的例子: struct bs{ unsigned m; u...

one-way or another 563

博途V17 & PLCSIM & FactoryIO 连接教程

PLCSIM V17 和 FactoryIO 连接教程前言一、软件版本二、连接步骤1. 连接PLCSIM2. 博途编程3.连接FactoryIO总结 前言 该文详细讲解了新手入门博途,并通过使用自带PLCSIM和FactoryIO实现连接。 一、软件版本 TIA Portal V17 S7-PLCSIM V17 Factory IO V2.5.1 二、连接步骤 1. 连接PLCSIM 打开PLCSIM 进入项目模式 新建仿真项目 2. 博途编程 将F

soledad_chao的博客 2万+

位域结构体

位域结构体

k6604125的博客 1291

变焦跟踪理论基础(如何在变焦过程中保持清晰)

如何在整个变焦过程中一直保持图像的清晰度或焦点是变焦跟踪的主要挑战。 当用户在缩放跟踪的情况下改变缩放时,设备保持对焦。 然而,在没有变焦跟踪的情况下,图像变得失焦,图像在变焦跟踪后由于自动对焦(AF)算法才最终对焦。...................................................

ChenYX的博客 20万+

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4883

C位域

位域声明: 在结构体内声明位域的形式如下: 下面是有关位域变量元素的描述: struct { type [menber_name] : width; }; 元素 描述 type 整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。 menber_name

decan5958的博客 368

MacOS蓝牙连接疑难杂症:从基础排查到高级修复全攻略

本文提供了一份全面的MacOS蓝牙故障排查与修复指南。从基础的菜单栏检查、终端命令诊断,到软/硬重启蓝牙服务、删除配置文件,再到使用blueutil工具、重置NVRAM等高级方法,系统性地解决了蓝牙无法连接、连接不稳定等常见问题。最后还分享了环境干扰排查、预防措施及硬件故障自检方法,帮助用户彻底解决Mac蓝牙连接难题。

weixin_29271263的博客 450

【C基础】位的对齐顺序

位的对齐顺序 位域的使用,位域一般存放数据默认都是字节内低位对齐,就是前面的是低位,后面的是高位; 如下面的代码一样; typedef struct bitmap { char bit0:1 char bit1:1 char bit2:1 char bit3:1 char bit4:1 char bit5:1 char bit6:1 char bit7:1 }; 位域、结构体...

Sam-zhang的博客 1776

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 523

C语言位域解析&符号位扩展规则

从一个例子说起: int main(void){ union{ int i; struct{ char a : 1; char b : 1; char c : 2; }bits; }num; printf("Input an integer fo...

SevenFighting的专栏 3957

第8讲:基于CST PCB Studio的电源完整性仿真(IR Drop + PDN)

本文系统介绍了电源完整性(PI)仿真的两大核心模块:直流IRDrop仿真与交流PDN阻抗仿真。文章详细阐述了两种仿真的原理、算法(PEEC和3DFE-FD)及完整操作流程,包括参数配置、软件实操步骤和常见问题解决方案。IRDrop仿真用于分析直流供电压降问题,PDN仿真则针对高频电源噪声和谐振问题。文中还提供了优化建议和故障排查方法,如调整铜箔厚度、优化电容布局等,为高速数字系统的电源完整性设计提供了全面的技术指导。(149字)

一只豌豆象的博客 238

c++ union位域

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhouxiaodan.blog.51cto.com/1177793/1202163 最近碰到一道题,顺带复习一下union的数据分布,题目如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

hanwystar的专栏 1244

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言之函数调用19—总结

C程序的函数调用共涵盖17个例题,包含了递归、递推、字符串操作、矩阵操作、格式输出等内容。 相比之前的基本算法,函数调用已经初见其效率,至此,相信大家对函数调用也有了比较好的认识,就是先表达出功能,当要解决问题时,只要简单调用即可。我们常常会听说C的强大,也是因为她有着调用函数的功能,而且函数可以自己实现。 接下来作者会推出文件操作的基础编程方法,希望大家能够共同进步。 不积跬步无以至千里!

交通分配与复杂网络分析 1441

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C语言I博客作业09

C语言I博客作业09 这个作业属于哪个课程 https://bbs.youkuaiyun.com/forums/csuft_swxy_C?typeId=17327 这个作业要求在哪里 https://bbs.youkuaiyun.com/topics/603700727 这个作业的目标 <学会运用函数解题> 学号 <20218590> 1.1 6-1 统计各位数字之和是5的数 本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;另一个函数统计给定区间内有多少个满

weixin_62142562的博客 427

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c语言转换成32位汇编语言怎么看,浅谈单片机中C语言与汇编语言的转换

一、单片机课设题目要求与软件环境介绍做了一单片机设计,要用C语言与汇编语言同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议。单片机设计:基于51单片机的99码表设计软件环境:Proteus8.0+ Keil4要求:1,开关按一下,数码管开始计时。2,按两下,数码管显示静止。3,按三下,数码管数值清零。二、C语言程序1 #include2 #define ...

weixin_36050664的博客 385

c swap方法在哪个库里面_C 语言位倒置函数(bit swap) 实现方法比较

#include "bitswap.h"/* "swaptab[i]" is the value of "i" with the bits reversed. */unsigned char bitSwapTable[256] ={0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0...

weixin_39742471的博客 235

C语言和设计模式(总结篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 设计模式的书相信很多人都看过。对于设计模式这样一种方法,相信不同的人有不同的理解。我在这里写的博客只是我个人对设计模式的粗浅认识。文中肯定存在很多的不足和不成熟之处,希望朋友们谅解。望大家多多指正,谢谢!01)C语言和设计模式(继承、封装、多态)02)C语言和设计模式(访问者模式)03)......

嵌入式-老费,一个分享专业嵌入式知识的blog 4万+

C语言试题(含答案解析)

1.下面C程序的运行结果为()A.编译错误B.1C.0D.运行错误'A’的ascii码值为65,‘B’的ascii码值为66,‘B’

2302_79180171的博客 5670

【C语言I博客作业09】

这个作业属于哪个课程 https://bbs.youkuaiyun.com/forums/csuft_swxy_C?category=0&typeId=17321 这个作业要求在哪里 https://bbs.youkuaiyun.com/topics/603526787 这个作业的目标 <学会使用函数> 学号 <20218544> C语言I博客作业091.1 PTA作业1.1 (题目名称):1.2 (题目名称):1.3 (题目名称):1.4 (题目名称):1. 2请给出本...

weixin_62142270的博客 248

C语言视频教程(初学C语言,还是看视频更直观)

对于初学C语言,看文字教程会存在厌学情绪,往往不乐意去看文字性的东西,不能够很好的理解文字介绍。作为初学者,我更推荐大家看视频教程,这样跟着老师的思路一步步编程,能够更直观和快速的入门C语言。我在我的百度网盘分享了四位老师的C语言视频教程,大家可以免费下载学习,下载地址: 网盘资料:链接:https://pan.baidu.com/s/1odgbx4gxSKqBkispTBxthg 提取码:vi74 更多关于C语言视频的教程通过百度网盘下载: 郝斌C语言入门视频教程下载(180集全) 小甲.

Dog语言 2677

C语言循环练习题(共23题)

经典循环23题,学习C语言循环必做。一起来练习练习吧

一沐一星辰 2万+

C语言和设计模式(总结篇) 用了多年的C

设计模式的书相信很多人都看过。对于设计模式这样一种方法,相信不同的人有不同的理解。我在这里写的博客只是我个人对设计模式的粗浅认识。文中肯定存在很多的不足和不成熟之处,希望朋友们谅解。以后编程开发也可以多多学习参考。

专注嵌入式软硬件开发。 1886

C语言 小记

本文讲解了一些关于C语言的小知识,以飨各位读者,各位可以根据目录找到自己所需,后续还会在本文中持续更新,请大家多多支持!

qq_58094522的博客 2996

C语言|博客作业09

C语言I博客作业09 作业头 这个作业属于哪个课程 <班级的链接> 这个作业要求在哪里 <作业要求的链接> 这个作业的目标 <你理解的作业目标具体内容> 学号 <20218558> 1.1统计各位数字之和是5的数 (20 分) 本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;另一个函数统计给定区间内有多少个满足上述要求的整数,并计算这些整数的和。 函数接口定义: int is( int number ); vo

m0_62146621的博客 397
下一篇: 一、郑愁予《错误》
please_say_d
博客等级 码龄7年 13粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值