C语言中的位段

news2024/9/25 7:23:28

        位段是通过结构体实现的,可以在一定程度上减小空间浪费,位段的声明和结构体类似,有以下几个不同:

①位段的成员必须是整形(int,char,short等)。

②成员后边有冒号和数字,表示该成员占几个bit位。

位段的内存分配

        我们知道结构体存在内存对齐的说法,会浪费一定的空间,那么位段的内存是怎么分配和使用的呢,位段的空间是按照需要以四个字节(int)一个字节(char)的方式开辟的,下面来举例说明一下:

struct A
{
//这里由于成员类型是int,所以一次要开辟四个字节,也就是32bit
    int a:2;
    int b:5;
//a和b占用7个bit,剩下25个bit不够c的,需要再开辟四个字节,所以总大小是8个字节
    int c:30;
}
struct S
{
//这里由于成员是char类型,先开辟一个字节,也就是8bit
    char a:3;
    char b:4;
//a和b用掉7bit,到c的时候还剩1bit,不够,需要再开辟一个字节,在vs编译器下,这里剩下的一个bit会浪费掉,c从新开辟的8bit中使用5bit
    char c:5;
//c用完后还剩3bit,不够d用,还需要再开辟一个字节,所以一共需要三个字节
    char d:4;
}
//如果c用掉第一个字节的最后一个bit,开辟新字节c只需要四个bit,剩下四个bit给d刚好,
//就可以少开辟一个字节,但是vs编译器就是会浪费掉用不完的字节,如果剩余字节不够,就从新开辟的字节开始使用

        了解了需要开辟多少空间,那么这些空间是怎么使用的呢:

        上图中开辟了三个字节的空间,可以看出每个字节都是从右往左开始使用,a占用了第一个字节的右边三位,b占用了第一个字节的中间四位,第一个字节的最左边一位浪费了,c占用了第二个字节的右边五位,第二个字节左边三位浪费,d占用了第三个字节的右边四位,第三个字节的左边四位浪费,a只有三位,无法存储1010,所以产生了截断,只存储了010。 

位段使用中的问题

        位段在使用中是存在一些隐患的:

①int位段被当成有符号数还是无符号数是不确定的,最好加上signed或unsigned。

②位段中最大位的数目不能确定(16位机器最大位数为16,32位机器最大位数为32),如果在16位机器中位的数目写的大于16会出问题。

③位段中的成员从左向右使用内存还是从右向左是不确定的(上面可以看出vs编译器是从右向左使用每个字节)。

④当前一个位段剩余位无法容纳下一个位段,开辟新空间后,后面的位段是舍弃剩余位还是使用剩余位,这一点也是不确定的(vs编译器是舍弃)。

        位段可以在满足结构体需求的前提下减小空间消耗,但是跨平台使用存在一些风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1706043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zigbee +PC上位机 无线控制二维云台开发笔记

今日尝试开发一款简单好学的PC上位机无线控制二维云台的小试验品: 主要开发环境与工具介绍: 单片机 STM32F103C8T6 使用标准库函数编程 Visual Studio 2022软件C# Winform 开发 上位机控制软件 DL_20 无线串口模块 + USB-TTL 模块 实现无线通…

tty/pty/console/getty/shell/telnet

tty 终端(termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是终端,可以认为terminal和tty是同义词。 tty泛指所有的终端设置,这些是真实存在的设备。 通过tty命令可以查看当前终端连接的设备。…

水电智能抄表是什么?

1.简述:水电智能抄表的兴起 水电智能抄表系统是现代科学技术和传统公共文化服务相结合的产物,它通过自动化技术性改变了传统的人工抄表方式,大大提高了高效率,降低生产成本,同时也为用户提供了更为贴心的服务。这一新…

5倍收益秘诀:APP广告如何变现?

在这个数字时代,智能手机几乎成了我们生活中不可或缺的一部分。无论是早晨醒来的第一件事,还是睡前的最后一件事,手机都与我们紧密相连。而在这个连接的世界里,APP广告变现成为了一个热门话题,它不仅仅是将每一次点击转…

TCL华星揽获技术创新奖,创新能力与伙伴价值再获肯定

近日,以“拥抱AI共创美好”为主题的2024年联想全球供应商大会在深圳圆满举办,重磅分享联想战略愿景和目标。 TCL华星应邀设置品牌展区,携手机、IT等领域10余款前沿显示产品亮相会场,以先锋显示科技演绎联合共创的多元化场景。联想…

InternLM2-Math-Plus全面升级,全尺寸最强的开源数学模型

总览 数学能力是大语言模型推理水平的重要体现。上海人工智能实验室在推出领先的开源数学模型InternLM2-Math的三个月之后对其进行了升级,发布了全新的 InternLM2-Math-Plus。升级后的 InternLM2-Math-Plus 在预训练和微调数据方面进行了全面的优化,显著…

ES升级--02--kibana安装与启动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Kibana官网文档https://www.elastic.co/guide/cn/kibana/current/targz.html 1.官网下载https://www.elastic.co/cn/downloads/past-releases#kibana 2.解压软件3.配…

软件系统开发标准流程文档(Word原件)

目的:规范系统开发流程,提高系统开发效率。 立项申请需求分析方案设计方案评审开发调整测试阶段系统培训试运行测试验收投入使用 所有文档过去进主页获取。 软件项目相关全套精华资料包获取方式①:点我获取 获取方式②:本文末个人…

C#【进阶】俄罗斯方块

俄罗斯方块 文章目录 Test1_场景切换相关BeginScene.csBegionOrEndScene.csEndScene.csGame.csGameScene.csISceneUpdate.cs Test2_绘制对象基类和枚举信息DrawObject.csIDraw.csPosition.cs Test3_地图相关Map.cs Test4_坐标信息类BlockInfo.cs Test5_板砖工人类BlockWorker.…

红队技巧:仿冒Windows登录

Metasploit框架:phish_windows_credentials Metasploit带有内置的后期漏洞利用功能,可帮助我们完成任务。由于它是后渗透的模块,因此只需要输入会话即可: use post/windows/gather/phish_windows_credentials set session 1 …

数字信封:保护数据传输的现代安全机制

在数字化时代,数据安全和隐私保护变得尤为重要。随着网络攻击和数据泄露事件的日益增多,传统的加密方法已经难以满足日益增长的安全需求。数字信封(Digital Envelope)作为一种有效的数据保护技术,提供了一种安全的数据…

视频监控技术前沿探索:智能化趋势与EasyCVR视频汇聚技术应用

在数字化时代的浪潮中,视频监控技术以其独特的优势,正在安防领域书写着新的篇章。它不仅为公共安全部门提供了强大的技术支持,还深入到教育、政府、娱乐、医疗、酒店、运动等多个领域,成为维护社会秩序、保障人民安全的重要工具。…

一套最完整的无人值守配电站房智能辅助监控系统(实用收藏版)

要真正了解无人值守配电室的运行模式,我们必须正确理解“无人值守”。“无人值守”与员工管理真正分离,但借助技术设备,无人值守配电站房智能辅助监控系统通过人机合理协调,确保配电室的正常运行。 通过无人值守配电站房智能辅助…

2024年6月PMP考试考前冲刺攻略

调整心态 考场就像战场一样,不仅是实力的较量,更是心理素质的较量。如果感到过于焦虑,可以通过运动等方式来缓解,也可以多与家人、朋友和老师沟通。只有稳定心态才能发挥出最大的实力! 高效学习方法 课本是基础&…

【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言随机查询语…

4.共享文件夹的设置

注:设置共享文件夹:首先要先关机 一、点击 编辑虚拟机设置 二、点击 选项 选项卡 三、点击 共享文件夹 四、在本地建立一个共享文件夹后选择路径 五、Linux系统文件夹中的共享文件夹路径 六、在Linux系统中查看共享文件夹 Ubuntushare是共享文件夹&…

protobuf —— 快速上手

protobuf —— 快速上手 创建 .proto 文件添加注释指定proto3语法package 声明符定义消息(message) 定义消息字段字段定义基本格式字段名称命名规范字段类型字段唯一编号示例 转换关系示例:增加姓名和年龄字段 字段唯一编号字段编号范围编码效…

ADC模数转换器的简介及参数详解

ADC全称是Analog-to-Digital Converter模数转换器,一般我们把模拟信号(Analog signal) 用A来进行简写,数字信号(digital signal) 用D来表示。是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。 今天我们主要说ADC的参数,我们把…

安全阀检测要求标准:如何提高检测效率与准确性?

安全阀,作为承压设备的重要保护元件,其性能的稳定性和可靠性直接关系到设备的运行安全。 因此,对安全阀进行定期、规范的检测显得尤为重要。接下来,佰德将围绕安全阀的检测要求标准,从检测前准备工作到检测报告与记录…

【网络服务】正向代理和反向代理到底是什么意思

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 前言 在学习和…