让人疑惑的C语言位域

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

在实际的应用中,有些数据的存储只需要几个二进制位,而不需要一个字节或几个字节,比如:电灯接通电源的状态,只有通电和未通电两种状态,用 1 和 0 就可以表示,为了满足这种需求,C 语言中引入了位域的概念

位域是什么

位域是一种数据结构,可以把数据以二进制位的形式紧凑的存储,它允许程序对此结构的位进行操作

在计算机早期,内存是非常稀缺的,需要尽可能的节省每一个字节,所以,C 语言中就出现了能针对二进制位进行操作的位域

为什么要用位域

位域这种数据结构,可以最大限度的节省存储空间,对于一些非常频繁的操作,需要尽可能的减少操作的数据,比如:在开发网络应用时,数据的序列化和反序列化是很频繁的,如果能减少数据的长度,对提升数据打包效率是很有帮助的

位域的出现,让我们可以用变量名代表某些bit,并通过变量名获取和设置 bit 的值,而不是通过晦涩难理解的位操作来进行,例如:

struct field
{
    unsigned char b0 : 3,
                  b1 : 2,
                  b2 : 3;
};

struct field bf;
bf.b1 = 3;

通过位域设置中间 2 个bit 的值,只需要设置结构体中 b1 字段值即可,如果使不用位域字段,就需要进行位的 “或” 和 “与” 运算

位域的使用

C 语言中,位域的表示形式如下

struct bitfield
{
    unsigned int b0 : n0,
                 b1 : n1,
                 b2 : n2,
                 ...
                 bn : nk;
};

b0、b1、b2 ... bn 表示位域成员,n0、n1、n2 ... nk 表示成员占用多少个 bit

位域表示的范围通常不能超过其所依附类型所能表示的 bit 数,比如:上面 bitfield 结构体中 位域所依附的类型是 unsigned int, 最大能表示 32 个 bit,也就是说,n0、n1、n2 ... nk 总 bit 数不能超过 32,每个成员超过指定 bit 表示的最大数值时会被截断,具体请看下面的例子

#include <stdio.h>
int main()
{
    struct fields
    {
        unsigned short a:7;
        unsigned short b:
C操作和操作比较 目录 1、 1.1、测试代码: 1.2、汇编: 1.3、分析: 2、操作 2.1、测试代码 2.2、操作汇编对照 结论 1、 通过Keil反编译研究了一下 的读写操作。 之前一直以为的操作就像变量的读写操作一样,同MOV指令一样一条指令搞定,结果不是。 1.1、测试代码: typedef struct { int a : 1; int b : 1; int d : 1; int e : 1; int f : 1; } register_. 阅读详情

相关推荐

银河麒麟arm64 V10 SP1桌面系统高效部署onnxruntime推理环境实战

本文详细介绍了在银河麒麟arm64 V10 SP1桌面系统上高效部署onnxruntime推理环境的完整实战流程。从系统环境准备、关键依赖安装,到onnxruntime的安装验证,并以YOLOv5模型部署为例进行性能对比分析,提供了在国产化飞腾D2000平台上进行AI边缘推理的实用指南和避坑技巧。

ss78901的博客 604

详细解读C++编程中的匿名类类型和

主要介绍了C++编程中的匿名类类型和,是C++入门学习中的基础知识,需要的朋友可以参考下

基于Simulink的永磁同步电机力混合控制(导纳+置)仿真

本文详细介绍了基于Simulink的永磁同步电机(PMSM)力混合控制系统实现方法。主要内容包括:1) 通过导纳控制原理(二阶质量-阻尼-弹簧模型)实现机器柔顺控制;2) 在Simulink中构建虚拟环境、导纳控制器、PMSM驱动系统等完整框架;3) 针对曲面恒力打磨场景,实现20N恒力跟踪(RMS误差1.2N)和置顺应;4) 支持纯置/导纳/恒力三种工作模式切换;5) 提供系统性能评估指标和高级扩展功能。该方案显著提升了机器环境交互的安全性和适应性,适用于精密装配、机协作等应用场景。

xiaoheshang_123的博客 128

清晰解读C语言中的、字节序、比特序、大小端

一、比特序/序 比特序表示一个字节中8个比特(bit)之间的顺序问题。分为LSB 0 序和MSB 0 序。 LSB(least significant bit):数据的最低存放在字节的第0。 MSB (most significant bit):数据的最高存放在字节的第0。 例如有一个十进制的数为174,对应的二进制数为1010 1110. 1.在LSB 0 序下,其存储形式如下图: 数据流的顺序为0-1-1-1-0-1-0-1 2.在MSB 0 序下,其存储形式如下图: 数

qq_34907757的博客 5705

及其效率

头一次听说C中的 bit fields

ghoshorn的专栏 2487

c++(bitfield)

C++ 类和结构可以包含比整型占用小于存储的成员。这些成员指定为 成员声明 规范的语法如下: declarator  : constant-expression (可选) declarator 是该成员在程序捕获的名称。它必须是整型 (包括枚举类型)。常数表达式指定该成员在结构占用的数。匿名,即不标识符的成员,可用于填充使用。宽度为0的一个未命名的强制下一的对

chenzhongjing的专栏 3739

C语言

C语言

Garrix的博客 1214

C语言结构体详解:内存优化、硬件交互与跨平台陷阱

在嵌入式开发、网络协议解析等底层编程场景中,精准控制内存布局和硬件交互是核心需求。C语言提供了一种名为“结构体”的特性,允许开发者以比特为单定义结构体成员,实现对内存的精细化管理。其原理在于编译器将高级语言中的声明映射到物理内存的特定比特,这要求开发者深入理解存储单元分配、内存对齐和字节序等底层概念。这项技术的核心价值在于极致的内存空间优化和与硬件寄存器、协议字段的直接对接,尤其适用于资源受限的嵌入式系统或需要处理海量标志的场景。然而,的内存布局高度依赖编译器和平台,涉及跨平台数据交换时存

weixin_34199764的博客 294

c语言疑惑问答

在我们学习当中,我们会思考很多问题,下面我们就提出几个针对前面学习的东西的一些疑惑。 下面函数运行结果的原因 #include<stdio.h> int main(){ int b = -5; unsigned int a = 10; if(a < b){ printf("a < b\n"); }else{ printf("a > b \n") } ...

weixin_42452337的博客 387

一篇文章详解C语言结构体,带你解决所有疑惑

目录C语言结构体怎么理解结构体结构体的定义与使用结构体指针结构体间相互赋值其它需要注意的 C语言结构体 你好! 和大多数C语言初学者一样,我在面对C语言结构体的学习时产生了诸多疑惑。我在查阅很多资料后对结构体有了一定理解,并把它总结在一篇文章中。希望可以帮助到大家。 怎么理解结构体 我们在编写C语言程序的过程中常常要面对涉及一个函数或者某一部分需要定义多个变量的情况。在这个时候,如果有一个类似文件...

芜湖 719

增量式pid c语言,关于增量式PID的代码(C语言)实现的详细说明--应该可以解决部分疑惑...

关于增量式PID的代码(C语言)实现的详细说明网上可以找到很多关于增量式PID的一些解释说明;最终都可以得到如下的公式:Δu=Kp·{e(n)-e(n-1)}+Ki·e(n)+Kd·{e(n)-2·e(n-1)+e(n-2)} ;最终转换成代码有很多是typedef struct{float Kp; //比例系数Proportionalfloat Ki;...

weixin_36425412的博客 1253

c语言数组的疑惑问题,C语言相关的几个疑惑

(1)C语言的创立早期的UNIX是用汇编语言编写的,但很笨拙,系统难以调试,理解困难。Thompson 想利用高级语言的一些优点,几经尝试后创建了B语言。B语言是对BCPL的简化,常驻内存。由于内存的限制,内存中只能放置解释器,而不是编译器,效率低下,同时,B语言无法表达不同的数据类型。Dennis Retchie 利用PDP-11的强大性能,创立了能够同时解决多种数据类型和效率的“New B“语...

weixin_42360285的博客 157

C语言初级疑惑(字符串)

想知道 两 段 代 码 , 有 什 么 区 别 吗 ? ? ? ? 谢谢大佬为我解答疑惑【感谢】

wazsja的博客 254

如何学好C语言

写这篇文章的主要目的是作为过来想给初学者一些学习建议。掌握一个好的学习方法,往往可以事半功倍。 想窥探神秘的代码世界?最好的入口无疑就是C语言。 C语言是计算机体系结构的基础,向下可以操作硬件(包括ARM,DSP,单片机等各种微处理器),还可以写驱动,写OS,写编译器。向上可以进一步的学习C++,JAVA等面向对象语言,再学习一些图形用户界面框架,比如Qt,MFC,就可做出类似于计算器、QQ...

码之有道 5万+

关于增量式PID的代码(C语言)实现的详细说明--应该可以解决部分疑惑

对于增量式PID 代码实现的详细说明;应给可以给部分解疑。

ah_yl的博客 2542

再谈C语言

五月 21, 2013 5 条评论 我在日常工作中使用C语言中的(bit field)的场景甚少,原因大致有二: * 一直从事于服务器后端应用的开发,现在的服务器的内存容量已经达到了数十G的水平,我们一般不需要为节省几个字节而使用内存布局更加紧凑的。 * 结构体中的实现是平台相关或Compiler相关的,移植性较差,我们不会贸然地给自己造“坑”的。 不过近期Linux技术内核社区(www.linux-kernel.cn) mail list中的一个问题让我觉得自己对bit field..

qq_34127958的博客 587

聊一聊C语言/

有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进。正是基于这种考虑,C语言又提供了一种叫做的数据结构。

不脱发的程序猿 1万+

Linux 系统编程 —— C结构体之段)

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制。例如在存放一个开关量时,只有0和1 两种状态, 用一二进即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“”或“段”。所谓“”是把一个字节中的二进划分为几个不同的区, 并说明每个区数。每个有一个名,允许在程序中按名进行操作。 这样就可以把几个不同的对象用一...

u011285208的博客 3164

linux 之C语言结构体冒号数据类型——

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制。例如在存放一个开关量时,只有0和1两种状态,用一二进即可。 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“”或“段”。所谓“”是把一个字节中的二进划分为几个不同的区,并说明每个区数。每个有一个名,允许在程序中按名进行操作。这样就可以把几个不同的对象用一个字节的二进制来表...

clam_zxf的博客 564

C语言中的

一、前言     有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“”或“段”。所谓“”是把一个字节中的二进划分为几个不同的区,并说明每个区数。每个有一个名,允许在程序中按名进行操作。 这样就可以把几个不同的对象用一个字节的二进制来表示。 二、的定义和变量的说明

zhubo22的专栏 888

基于RS485通讯的西门子S7-200SMART_PLC一拖二恒压供水系统解决方案与实践

基于RS485通讯的西门子S7-200SMART_PLC一拖二恒压供水系统的解决方案。该系统集成了Smart700触摸屏和ABB变频器,实现了精准的供水控制。文中不仅提供了详细的硬件配置和接线方法,还深入解析了程序的关键逻辑,如倒泵逻辑、压力波动处理以及定时切换机制。此外,作者分享了许多实际项目中的经验和教训,确保系统的稳定性和可靠性。适合群:从事工业自动化领的工程师和技术员,尤其是对PLC编程和恒压供水系统感兴趣的读者。使用场景及目标:适用于需要构建高效、稳定的恒压供水系统的工程项目。目标是帮助读者掌握系统的设计思路、编程技巧以及常见问题的解决方法。其他说明:文中提供的程序样例和工艺说明均来自实际项目案例,具有很高的实用价值。对于初学者来说,可以通过逐步理解和实践这些内容,提升自己的技术水平。

上一篇: 如何理解字节序
下一篇: 彻底搞明白 GB2312、GBK 和 GB18030
Linux开发那些事儿
博客等级 码龄10年 32粉丝 52原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值