C语言【位段】详解

发布时间:2026/11/9 6:27:51

C语言【位段】详解 引言详细介绍C语言中的位段是什么位段的内存分配位段的跨平台问题位段的应用位段使用时的注意事项一、位段是什么在 C 语言里位段Bit - field属于一种特殊的数据结构它允许你在一个结构体里以位为单位对数据进行定义和使用这样就能更有效地利用内存空间。位段的声明和结构体是类似的有两个不同1. 位段的成员必须是 int 、 unsigned int 或 signed int 在C99中位段成员的类型也可以 选择其他类型。2. 位段的成员名后边有一个冒号和一个数字。比如struct A { int _a : 2; int _b : 5; int _c : 10; int _d : 30; };这里A就是一个位段对比一下结构体和位段在内存中的大小//结构体 struct A1 { int _a; int _b; int _c; int _d; }; //位段 struct A2 { int _a : 2; int _b : 5; int _c : 10; int _d : 30; }; int main() { printf(%zd\n, sizeof(struct A1));//16 printf(%zd\n, sizeof(struct A2));//8 return 0; }运行结果会发现位段A2占8个字节结构体A1占16个字节这是为什么呢二、位段的内存分配struct A { int _a : 2; //占用2个bit位 int _b : 5; //占用5个bit位 int _c : 10; //占用10个bit位 int _d : 30; //占用30个bit位 };1. 位段的成员可以是 int , unsigned int , signed int 或者是char 等类型。2. 位段的空间上是按照需要以4个字节 int 或者1个字节 char 的方式来开辟的。3.位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使用位段。举一个例子来说明一下代码struct S { char a : 3; //占3个bit char b : 4; //占4个bit char c : 5; //占5个bit char d : 4; //占4个bit }; int main() { struct S s { 0 }; printf(%zd\n, sizeof(struct S)); s.a 10; //令a 10 二进制是 1010 只能放 3位哪三位不确定 s.b 12; //令b 12 二进制是 1100 4个bit可以放下 s.c 3; //令c 3 二进制是 0011 5个bit可以放下 s.d 4; //令d 4 二进制是 0100 4个bit可以放下 } //空间是如何开辟的这里是在VS2022上1. 申请到一个字节在使用的时候这些比特位从左向右使用还是从右向左使用不确定假设是从右向左使用。2.剩余的空间不够下一个成员使用是否浪费不确定。假设是浪费看下图分析上图中的3个字节里面的二进制是 01100010 00000011 00000100对应的十六进制是4个二进制转化成1个十六进制6 2 0 3 0 4调试一下运行结果说明假设正确。三、位段的跨平台问题1. int 位段被当成有符号数还是无符号数是不确定的。2. 位段中最大位的数目不能确定。16位机器最大1632位机器最大32写成27在16位机器会出问题。3. 位段中的成员在内存中从左向右分配还是从右向左分配标准尚未定义。4. 当⼀个结构包含两个位段第⼆个位段成员比较大无法容纳于第⼀个位段剩余的位时是舍弃剩余的位还是利用这是不确定的。总结 跟结构相比位段可以达到同样的效果并且可以很好的节省空间但是有跨平台的问题存在。注意取值范围位段所能表示的数值范围由其占用的位数决定。例如占 2 位的位段其取值范围是 0 到 3即 (2^2 - 1)占 3 位的位段取值范围是 0 到 7即 (2^3 - 1)依此类推。内存对齐位段的内存分配与结构体的内存对齐规则有关。在某些情形下为了保证访问效率编译器也许会在成员间插入填充位。类型限制位段成员的类型通常是unsigned int、signed int或者boolC99 引入。虽然部分编译器也支持char类型的位段但最好使用int类型以保证可移植性。四、位段的应用下图是网络协议中IP数据报的格式我们可以看到其中很多的属性只需要几个bit位就能描述这里使用位段能够实现想要的效果也节省了空间这样网络传输的数据报大小也会较小⼀些对网络的畅通是有帮助的。五、位段使用的注意事项位段的几个成员共有同一个字节这样有些成员的起始位置并不是某个字节的起始位置那么这些位置处是没有地址的。内存中每个字节分配一个地址一个字节内部的bit位是没有地址的。 所以不能对位段的成员使用取地址操作符这样就不能使用scanf直接给位段的成员输人值只能是先输入放在一个变量中然后赋值给位段的成员。如代码:struct A { int _a : 2; int _b : 5; int _c : 10; int _d : 30; }; int main() { struct A sa { 0 }; scanf(%d, sa._b);//这是错误的 //正确的⽰范 int b 0; scanf(%d, b); sa._b b; return 0; }
延伸阅读

更多相关文章

2026/11/7 11:51:13

Windows转发Linux系统的X11(二):By MobaXterm

1、背景 在上一篇博客(Windows转发Linux系统的X11(一):By XMing)中,笔者展示了如何使用XMing来实现X11 server的转发,但是在文章的最后,笔者提到,在使用XMing转发某些大…

2026/11/7 12:00:56

Windows安装Ubuntu20.04系统(双系统)

安装准备:一个空白U盘(≥4G),电脑足够的空闲硬盘空间(用来安装Ubuntu系统) 1.Ubuntu镜像文件 历史版本选择“其他下载”——“查看历史版本”——“找到所需版本(个人下载选择桌面映像&#x…

2026/11/4 13:48:51

计算机Django毕设实战-基于 Django 的校园常态化防疫信息管理系统 大学生健康信息登记与疫情防控系统设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/11/9 6:23:40

电工证能算上岗证吗 考前押题怎么用才靠谱

电工证能算上岗证吗 考前押题怎么用才靠谱 怕考不过白交培训费?别急,先搞清楚电工证到底能不能当上岗证用,再看怎么用考前押题提高通过率。 电工证是上岗证吗?一文说清楚…

2026/11/9 6:23:40

谁需要电工证挂靠的 上岗必备证书别白交钱

谁需要电工证挂靠的 上岗必备证书别白交钱 怕考不过白交培训费?别再被坑了!现在不少电工朋友在考电工证的时候,生怕花钱了最后拿不到证,更怕证书挂靠不上、用不上,白白浪费时间和钱。电工证确实是 上岗必备…

2026/11/9 6:23:40

电工证怎么查看日期全国通用吗怎么转接

电工证怎么查看日期全国通用吗怎么转接 之前考的证在外省能不能转过来?这是很多电工朋友在考证后常问的问题。特别是在濮阳这样的三四线城市,很多学员在外地考的证,回到本地后常常遇到无法使用的情况。其实,国家早就明确, 电工证是全国通用…

2026/11/9 6:23:40

上海电工证初训千万别踩坑:工地太忙根本没时间复习考试怎么办?

上海电工证初训千万别踩坑:工地太忙根本没时间复习考试怎么办? 工地太忙根本没时间复习考试,这话我听太多了。特别是在洛阳涧西区,不少转岗的从业者,从别的工种转到电工岗位,一来就被要求参加【上海电工证初训】,结果连报名流程、考试内容都一头雾水,…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑