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; }

相关新闻

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

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

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

2026/10/18 10:19:41 阅读更多 →
大龄IT从业人员如何实现大厂梦之三(终结篇)

大龄IT从业人员如何实现大厂梦之三(终结篇)

引言:大龄IT从业者的年龄是求职过程中不得不面对的一个关键问题。为此,基于行业现状和公开案例整理了对大龄 IT 从业者应对年龄问题的具体建议,分为求职策略、职业规划、技能提升和心态调整四部分。本篇是大龄IT从业人员如何实现一线大厂高薪…

2026/10/19 13:21:39 阅读更多 →
索尼 FX5 登场:全画幅 5K 传感器+多样功能,还可选配可倾斜 OLED 取景器!

索尼 FX5 登场:全画幅 5K 传感器+多样功能,还可选配可倾斜 OLED 取景器!

索尼 FX5:为电影摄影师打造的功能利器全新索尼 FX5 为电影摄影师带来了一系列强大功能。它配备了全画幅全堆叠式 5K 传感器,这一配置使得相机在画质捕捉上有了质的提升,能够满足电影级别的拍摄需求。同时,它支持开放片门录制&…

2026/10/18 10:20:11 阅读更多 →

最新新闻

SRC信息收集进阶:从被动收集到情报网络的实战方法论

SRC信息收集进阶:从被动收集到情报网络的实战方法论

我一直觉得,SRC 信息收集做到后面,拼的早就不是工具数量,而是你对“资产”和“情报”这两个词的理解深度。第一集我们聊了从零开始怎么把域名、IP、子域名这些基础资产捞出来,很多人照着做完一轮,发现东西是收集了一堆…

2026/10/20 6:29:34 阅读更多 →
用代码生成PPT:内容与样式分离的自动化实践

用代码生成PPT:内容与样式分离的自动化实践

1. 为什么我要自己动手做一个 PPT 生成工具做技术分享、写项目复盘、给团队做内部培训,绕不开的一件事就是做 PPT。我粗略算过,过去一年我至少做了四十多份演示文稿,平均每份按六到八小时算,光花在排版、对齐、调字体、找配图上的…

2026/10/20 6:29:34 阅读更多 →
基于python-pptx的PPT自动化生成方案:模板引擎与数据驱动实践

基于python-pptx的PPT自动化生成方案:模板引擎与数据驱动实践

1. 项目缘起与核心定位第一次看到“ppt-master”这个命名,我的直觉是:这大概率是一个围绕演示文稿自动化生成或批量处理的工具型项目。在办公自动化领域摸爬滚打这些年,我见过太多团队被PPT折磨得死去活来——每周例会要出汇报材料、每月要交…

2026/10/20 6:29:34 阅读更多 →
科学家会被Agent取代吗?技能库让AI做科研从Demo走向日常

科学家会被Agent取代吗?技能库让AI做科研从Demo走向日常

科学家会被Agent取代吗?技能库让AI做科研从Demo走向日常 【免费下载链接】scientific-agent-skills Turn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 250,000 scientists worldwide. 177 ready-to-use validated skills…

2026/10/20 6:29:34 阅读更多 →
STM32F103内部Flash读写:掉电不丢参数的嵌入式存储方案

STM32F103内部Flash读写:掉电不丢参数的嵌入式存储方案

简介:一套基于STM32F103芯片内部Flash读写的完整例程,适合嵌入式入门开发者及需要在项目中实现固件升级、参数存储、日志记录等功能的工程师。例程基于HAL库编写,完整涵盖了Flash解锁、扇区擦除、数据编程、读取校验、再次上锁的标准流程&…

2026/10/20 6:29:34 阅读更多 →
JMeter压测Kafka:手写Java脚本攻克SASL认证难题

JMeter压测Kafka:手写Java脚本攻克SASL认证难题

这周接了一个压测需求,要给某个内部Kafka主题灌一批业务数据,规模大概几十万条,消费端开了SASL认证,而且不是常见的PLAINTEXT全局认证,只是针对特定用户做了SASL_PLAINTEXT。我第一个反应是找现成的JMeter Kafka插件&a…

2026/10/20 6:28:34 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →