结构体实现位段
目录
1.什么是位段
2.位段的计算
3. 位段的内存分配
4.位段的跨平台问题
5.位段的应⽤
6.位段使⽤的注意事项
1.什么是位段
段位的声明和结构体是类似的,但有两个不同之处:
1. 位段的成员必须是 int ,unsigned int,或 signed int,char类型 (整形家族),在C99中位段也可以是其他类型
2. 位段的成员名后有一个冒号和一个数字
例:
struct A
{int _a : 2; //_a只能使用2个比特位大小int _b : 5; int _c : 10;int _d : 30;
};
这里A就是位段的类型,冒号后面的数字表示该元素所占用空间的大小(单位:bite)
冒号后面数字的大小不能超过该成员所开辟空间的大小
这段A占多大空间呢
2.位段的计算
我们知道了位段,那么位段应该怎么计算呢?
开辟规则:位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的。
例:
struct B
{char _a : 3;char _b : 4;char _c : 5;char _d : 4;
};
因为是char类型,所以按照需要一次开辟1个字节 即:8个bit位,先将数据往里放,不够用了在继续开辟
第一次_a存入3个bit,然后_b继续存入4个bit,此时我们开辟的空间已经剩下1bit,支持不了_c的存放,于是又开辟了8个bit,这时分两种情况:
- 使用前面剩下的1bit空间,然后继续使用新开辟的8bit中的4bit
- 丢弃前面开辟的1bit空间,直接使用新开辟的空间存放_c
这两种情况并没有明确的规定使用哪一个,根据编译器的不同可能情况各异。我当前使用的是VS2022,是按照第二种情况开辟空间的,此时_c成员使用了5bit,还剩下3bit,已经不足以存放_c了,于是又开辟了一个空间存放_d。到此所有的成员已存放完成,使用了3字节,浪费了8bit的空间
3. 位段的内存分配
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使⽤位段。
位段使用因环境而异,不同的环境可能需要相符合的位段,虽然麻烦,但是位段很节省空间
例:
struct B
{char _a : 3;char _b : 4;char _c : 5;char _d : 4;
};int main()
{struct B a = { 0 };a._a = 10;a._b = 12;a._c = 3;a._d = 4;return 0;
}
我们知道结构体B的大小是3字节,现在我们想在这些空间上面赋一些值
在内存分配的时候我们可能会遇到一个问题,他是怎么分配资源的呢?从左向右还是从右向左呢?
这是一条C语言标准尚未定义的规则,所以不同编译器下可能不一样,在VS2022编译器下经过测试是按照从右往左使用的
所以VS2022上的分配情况:

存放数据示图:

原本_a是1010,由于_a只有3个bit的空间,所以只能舍弃前面的1
我们将二进制转换为十六进制,
先写出这三个空间的二进制:01100010 00000011 00000100
转换十六进制:64 03 04

4.位段的跨平台问题
- int位段被当成有符号数还是⽆符号数是不确定的。
- 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会 出问题。
- 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
- 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利⽤,这是不确定的。
在使用位段时需要十分谨慎,因为跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。
5.位段的应⽤
使用微信,qq,以及其他的一些聊天软件时,我们只需将发送的内容写入对话框并点击发送即可,但是这其中要实现不像我们操作的这么简单
比你想象得更加复杂的多,当你发消息给某人时,系统需要知道这个信息从哪来,到哪去,以及这条信息的生存时间等等
如图:

如上图我们使用段位就可以节省大量空间,而且当我们发送消息时,发出去得数据包越小,我们传输的效率就越高,打个比方,在满是汽车的高速公路上,如果所有车都是小汽车,那么交通就会很便利,流畅,但如果全是大货车,体型很大的车,那么就会让交通很堵塞,交通不便利
6.位段使⽤的注意事项
位段的⼏个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位 置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。所以不能对位段的成员使⽤&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是先输⼊ 放在⼀个变量中,然后赋值给位段的成员。
struct B
{char _a : 3;char _b : 4;char _c : 5;char _d : 4;
};int main()
{struct B a = { 0 };scanf("%d", &a._a);//错误的演示,编译器会报错,不允许使用位域的地址//正确的操作int b = 10;a._a = b;return 0;
}相关文章:
结构体实现位段
目录 1.什么是位段 2.位段的计算 3. 位段的内存分配 4.位段的跨平台问题 5.位段的应⽤ 6.位段使⽤的注意事项 1.什么是位段 段位的声明和结构体是类似的,但有两个不同之处: 1. 位段的成员必须是 int ,unsigned int,或 sign…...
刷题DAY35
判断回文数 题目:MM们都爱美,“回文”就是一种非常美的特殊的数或者文字短语,他们无论是顺读还是倒读,结果都一样。例如:12321, 55555,45554。如果GG们动不动来一段回文向MM们表达一下…...
LVS--负载均衡调度器
文章目录 集群和分布式集群分布式 LVS介绍LVS特点LVS工作原理LVS集群架构 LVS集群中的术语CIPVIPRSDIPRIP LVS集群的工作模式NAT模式DR模式DR的工作原理DR的特点:DR的网络配置1.配置负载均衡器2.配置后端服务器lo接口的作用 3.测试连接: DR的典型应用场景 TUN模式 L…...
windows@共享网络共享打印机@局域网内远程调用打印机打印
文章目录 abstract流程简述预备工作启动服务🎈启用网络发现和共享开关检查共享密码保护(可选) 相关概念通过GUI设置局域网共享打印机使用开始菜单直接跳转到打印机设置逐步操作 命令行配置方式使用net命令共享打印机使用powershell相关模块配置 使用PowerShell 配置…...
sql格式化工具
1.在线格式化工具:https://www.qianbo.com.cn/Tool/Beautify/Sql-Formatter.html 2. 格式化后用拼接 string sql " SELECT rack.rackRow,rack.rackColumn,rack.rackLayer FROM rack LEFT JOIN TaskListON rack.rackColumn TaskList.Unload_ColAND rack.rackRow TaskL…...
[Python办公]常用Python数据采集爬虫技术对比
常用的数据采集技术可以分为以下几种: 1.网页抓取(Web Scraping) 网页抓取是通过模拟浏览器行为或直接发送请求来获取网页内容的技术。其核心目标是从 HTML 网页中提取有价值的数据。 常用工具:requests、BeautifulSoup、Selen…...
相机光学(三十七)——自动对焦原理
1.自动对焦的三种方式 目前在手机上采用的自动对焦系统包括反差对焦、相位对焦和激光对焦三种方案,下面我们来看一下它们的工作原理和相互之间的区别是什么。 1.1反差对焦【CDAF】- Contrast Detection Auto Focus 反差对焦是目前普及率最高、使用最广泛、成本相对…...
Go语言现代web开发05 指针和结构体
指针 Pointers are complex data types that store the memory address of value. Simply put, if we have a value stored in the memory address as 100 and a pointer to that value, the pointer value will be 100. The default value for a pointer is nil. Nil pointer…...
Postgresql 删除数组中的元素
extra为 {“a”: [null, 3, null],“b”: 111} 使用sql 将extra中a中的null移除 第一步: 首先先把[null, 3, null]移除, select json_agg(elem) filter ( where elem ! null ) from (select jsonb_array_elements([null,3,null]::jsonb) as elem) t;这…...
docker 多服务只暴露一个客户端
业务场景 docker部署多个服务时候,当为了安全考虑 部署了多个服务,数据库,缓存库,文件服务器啥的,如果全都暴露的话可能会增加资源侵入的风险,所以只需要挂载一个客户端端口给外部访问即可,其他服务均在内网,保障资源安全 docker 网络 可以把容器们都放在同一网络下,由于docke…...
DFS算法专题(二)——穷举vs暴搜vs深搜vs回溯vs剪枝【OF决策树】
目录 1、决策树 2、算法实战应用【leetcode】 2.1 题一:全排列 2.2.1 算法原理 2.2.2 算法代码 2.2 题二:子集 2.2.1 算法原理【策略一】 2.2.2 算法代码【策略一】 2.2.3 算法原理【策略二,推荐】 2.2.4 算法代码【策略二&#x…...
Spring Security 快速开始
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 一、认证 1、从数据中读数据完成认证 Service public class MyUserDetailsService implements UserDeta…...
Lua5.3 参考手册
《Lua 5.3 参考手册》是对 Lua 5.3 版本语言的官方定义。这份手册详细描述了 Lua 语言的语法、语义以及标准库和 C API。它是由巴西里约热内卢 Pontifical Catholic 大学的 PUC-Rio 团队开发的,并且是一个自由软件,广泛应用于世界各地的产品和项目中【9†…...
Centos如何配置阿里云的yum仓库作为yum源?
背景 Centos在国内访问官方yum源慢,可以用国内的yum源,本文以阿里云yum源为例说明。 快速命令 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.a…...
力扣139-单词拆分(Java详细题解)
题目链接:139. 单词拆分 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完背包,所以现在的题解都是以背包问题为基础再来写的。 如果大家不懂背包问题的话&#…...
CSS —— display属性
用于指定一个元素在页面中的显示方式 HTML中标签元素大体被分为三种类型:块元素、行内元素和行内块元素 块元素 :block 1.独占一行 2.水平方向,占满它父元素的可用空间(宽度是父级的100%) 3.垂直方向,占据的…...
BTC ETF资金流入暴涨400%,市场下一步将如何发展?
近期,BTC现货ETF(交易所交易基金)市场出现了显著的资金流入,尤其是在9月10日,BTC ETF吸引了近1.17亿美元的资金流入,相较于前一天的3729万美元,暴涨了400%。这种现象引发了市场广泛关注…...
视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景
在视频监控系统中,视频画面的稳定性对于确保监控效果至关重要。抖动现象是指视频画面中存在不稳定或频繁晃动的情况,这可能会影响视频的清晰度和可读性。LntonAIServer通过引入抖动检测功能,帮助用户及时发现并解决视频流中的抖动问题&#x…...
初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本
需求: 做了一个租赁的项目,里面要求签署个人授权协议,里面要填写姓名,手机号,身份证号,签署日期等参数,格式如下图 格式: 如上图,word中的字符串模板变量使用${varname…...
每日一问:C++ 如何实现继承、封装和多态
每日一问:C 如何实现继承、封装和多态 C 是一门面向对象编程语言,通过继承、封装和多态这三个核心特性实现了对复杂系统的高效管理和扩展。继承让代码重用性得以提升,封装保护数据的完整性,而多态通过不同的接口实现了灵活性。本文…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
