当前位置: 首页 > news >正文

浅谈C语言位段

1、位段的定义

百度百科中是这样解释位段的:

位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。

以下,我们均在VS2022的编译环境下去探讨和理解位段

2、位段的声明和使用

A、位段的声明

位段是与结构体相结合的,只有在结构体中才能使用位段,位段使用的根本目的是为了节省不必要消耗的内存空间。

这是位段的声明,这里有4个点需要注意:

1、上图中的1、2、3均是指比特位,即bit,一个二进制位

2、位段的适用类型只限于整型家族

3、同一个结构体中,使用位段时最好保持其中成员类型均相同

4、位段的大小不能超过该类型的实际大小,比如说对于char类型,最多只能是8个比特位,对于int类型,最多只能是32个比特位

B、位段的使用

以下是位段的简单使用:

3、位段的内存大小的计算

考虑到在不同的平台环境下,位段的内存大小计算有所不同,以下关于位段内存大小的计算是基于VS2022的编译环境:

例1:

在位段中,编译器看到char类型便会向内存中申请1个字节的空间。

a占去5个比特位,还剩3个比特位;b将这3个比特位占掉,此时第1个字节的空间用完。

紧接着的成员是char类型的c,又会开辟1个字节的内存空间,c占去4个比特位;

成员d要占去5个比特位,但是之前开辟的1个字节中仅剩4个比特位,不够用,所以将这4个比特位

舍去,重新开辟1个字节用以存储d,故最终该位段的大小为3个字节

例2:

VS编译器看到int类型的成员,便会向内存申请4个字节的空间

a占去1个比特位,还剩31个比特位;b在这剩余的31个比特位中占去30个比特位,还剩1个比特位;

c要占去4个比特位,剩余的1个比特位显然不够用,所以再开辟4个字节的内存空间,在这新开辟的4个字节中,c占到4个比特位

d则是在剩下的28个比特位中占20个比特位

所以,该位段的大小为8个字节.

4、位段在内存中的存储方式

考虑到位段在不同的编译器下存储方式有所不同,以下的讨论均基于VS2022。

探讨位段在内存中的存储方式,其本质是去探讨,在开辟的1个字节或4个字节的空间中,各个结构体成员在该空间内部是从左向右(低地址向高地址)存储的,还是从右向左(高地址向低地址)存储的。

我们这里先说结论:位段在内存中是从右向左存储的,即高地址向低地址存储的

以下进行相关验证:

struct S
{char a : 1;//1char b : 6;//001010char c : 4;//0101char d : 3;//011
};
//0001 0101     0011 0101
// 1     5       3    5 
int main()
{struct S s = { 0 };s.a = 1;//1s.b = 10;//1010s.c = 5;//101s.d = 11;//1011return 0;
}

将s初始化为0,则s的2个字节,16个比特位中均为0

在s的第1个字节空间中,从右向左存储,将a存储进去,存储的是1;b在初始化后6位二进制中放的是000000,在赋值后,存储的是001010,故第1个字节中存放的是 00010101

在s的第2个字节空间中,从右向左存储,将c存储进去,存储的是0101

由于d只有3个比特位的空间,故赋值11时会发生截断,实际存储到d中的是011,因此第2个字节中存放的是 00110101

将这2个字节转换为16进制表示则为 : 15  35

接下来我们通过内存窗口进行观察验证:

可以看到内存中存储的确实为15 35,说明在VS2022的编译环境下,位段在内存中确实是从右向左(高地址向低地址)存储的

5、位段的局限

位段有很多的局限,这些局限也就导致了位段的跨平台性很差:

1、位段中int类型是看成 signed int 还是 unsigned int 这是不确定的

2、位段中最大位的数目不能确定。位段的大小除了不能超过相应类型的实际大小外,还不能超过机器的位数。在16位的机器上,位段最大为16个比特位;而在32位的机器上,位段最大为32个比特位

3、位段在内存中究竟是从左向右存储,还是从右向左存储,这是标准未定义的

4、在1个结构体中,开辟的内存空间在容纳完1个位段后,剩余的位无法容纳第2个位段时,这些剩余的位是利用还是不利用,这是不确定的

综上所述,为了保证程序的可移植性,应尽量避免位段的使用。

相关文章:

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下,我们均在VS2022的…...

arcgisserver登陆信息不正确

密码明明对,但是登录提示登录信息不正确 Arcgis server 9.3.1 无法登录ArcGIS Manager 提示Incorrect Login Information 操作系统windows 2008 x64server 解决办法: 关闭window防火墙解决。 如果防火墙已经关闭: 通过修改用户口令后就可以重…...

KOLA: CAREFULLY BENCHMARKING WORLD KNOWLEDGE OF LARGE LANGUAGE MODELS

文章目录 题目摘要简介KOLA 基准实验评估结论和未来工作道德声明 题目 KOLA:仔细对大型语言模型的世界知识进行基准测试 论文地址:https://arxiv.org/abs/2306.09296 项目地址:https://github.com/ranahaani/GNews 摘要 大型语言模型 (LLM) 的卓越性能要求评估方法…...

Robot Operating System——机器人关节的角度、速度和力矩

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::JointState 是 ROS (Robot Operating System) 中的一个消息类型,用于表示机器人关节的状态信息。它通常用于传输和处理机器人关节的角度、速度和力矩等信息。 应用场景 机器人控制 关节控制:在机器人…...

一分钟掌握java9新特性

try-with-resources语句 /** * 在处理必须关闭的资源时,使用try-with-resources语句替代try-finally语句。 生成的代码更简洁,更清晰,并且生成的异常更有用 * java9 之前写法 */ public static String readFile1(String fileName){ tr…...

89. UE5 RPG 实现伤害 冷却 消耗技能描述

在上一篇文章里,我们能够通过富文本显示多种格式的文字,并显示技能描述。在这一篇文章里,我们继续优化技能描述,将技能说需要显示的内容显示出来。 实现火球术的基础描述 首先,我们现实现火球术的基础描述&#xff0…...

el-tree树状控件,定位到选中的节点的位置

效果图 在el-tree 控件加 :render-content"renderContent" 在掉接口的方法中 实际有用的是setTimeout 方法和this.$refs.xxxxxx.setCheckedKeys([industrycodeList]) if(res.data.swindustrylist.length>0){res.data.swindustrylist.forEach(item > {industry…...

YOLO目标检测的单目(多目标测距),使用相机光学模型,支持目标检测模型训练,可输出目标位置和距离信息并可视化

本项目旨在开发一个基于YOLO的目标检测系统,该系统不仅能检测图像中的多个目标,还能利用单目摄像头的图像估计每个目标与摄像头之间的相对距离。系统的核心组成部分包括目标检测、距离估计、模型训练以及结果可视化。 主要功能 目标检测:使用…...

unity简易lua文件迁移工具

一. 了解商业游戏的Lua热更新开发方式 市面上的3种结合Lua热更新的开发方式 1.纯Lua开发(所有的游戏主要逻辑都用Lua实现) 好处:机动性强;坏处:代码效率略差 2.半C#,半Lua开发(核心逻辑C#开发…...

Elasticsearch中的自动补全功能详解与实践

简介 自动补全是现代搜索引擎中的一项重要功能,它能够根据用户的输入提供实时的建议,提高用户体验。Elasticsearch提供了Completion Suggester查询来实现这一功能。本文将详细介绍Elasticsearch中的自动补全功能,并提供详细的配置和查询示例…...

前端如何使用Nginx代理dist网页,代理websocket,代理后端

本文将指导您如何配置Nginx以代理前后端分离的项目,并特别说明了对WebSocket的代理设置。通过本教程,您将能够实现一次性配置,进而使项目能够在任意局域网服务器上部署,并可通过IP地址或域名访问服务。 笔者建议 先速览本文了解大…...

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 问题解决

问题描述 原来我的服务器docker服务运行正常,但在某次尝试用时, 根据系统的错误提示执行了snap install docker指令之后, 再执行docker ps命令则提示Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running…...

零基础学习Redis(2) -- Redis安装与配置

Redis官方是并不支持Windows系统的,并且现在绝大部分公司都是使用的Linux,所以我们在Linux上进行安装,这里我使用的是Ubuntu 1. 安装步骤 1. 首先使用工具连接到我们的云服务器,然后输入apt指令搜索redis相关的软件包&#xff1…...

UniApp第一天

一、官网介绍 1.1、 SDK SDK是"Software Development Kit"的缩写,中文意思是“软件开发工具包”。SDK通常是由软件开发者为其他开发者提供的一个软件工具集合,用于帮助开发者快速开发、测试和部署软件应用。SDK通常包含了一系列的开发工具、库…...

TLE4966-3G带方向检测功能的高灵敏度汽车霍尔开关

TLE4966-3G是一款集成电路双霍尔效应传感器,专为使用旋转极轮的高精度应用而设计。通过片上有源补偿电路和斩波器技术实现精确的磁切换点和高温稳定性。 该传感器在Q2提供速度输出,其状态(高或低)与磁场值相对应。对于超过阈值BO…...

Github 2024-08-14 C开源项目日报Top10

根据Github Trendings的统计,今日(2024-08-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Objective-C项目1PHP项目1Python项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 …...

飞桨Paddle API index_add 详解

index_add paddle.index_add(x, index, axis, value, nameNone)[源代码] 沿着指定轴 axis 将 index 中指定位置的 x 与 value 相加,并写入到结果 Tensor 中的对应位置。这里 index 是一个 1-D Tensor。除 axis 轴外,返回的 Tensor 其余维度大小和输入 …...

后端代码练习1——加法计算器

1. 需求 输入两个整数&#xff0c;点击 “点击相加” 按钮&#xff0c;显示计算结果。 2.准备工作 创建Spring Boot项目&#xff0c;引入Spring Web依赖&#xff0c;把前端代码放入static目录下。 2.1 前端代码 <!DOCTYPE html> <html lang"en"> <h…...

观察者模式和MQ是什么关系

观察者模式&#xff08;Observer Pattern&#xff09;和MQ&#xff08;Message Queue&#xff0c;消息队列&#xff09;之间的关系主要体现在它们所实现的功能和机制上的相似性&#xff0c;尽管它们在技术实现和应用场景上有所不同。 观察者模式 观察者模式是一种行为型设计模…...

JDK动态代理和CGLIB动态代理案例分析

JDK动态代理和CGLIB动态代理案例分析 JDK动态代理和CGLIB动态代理的实现原理如下&#xff1a; JDK动态代理的实现原理&#xff1a; JDK动态代理是基于Java的反射机制实现的实现一个继承InvocationHandler接口的对象&#xff0c;重写invoke方法&#xff0c;invoke方法中可以在目…...

【数据结构-前缀哈希】力扣1124. 表现良好的最长时间段

给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这段时间内&#xff0c;「劳累的天数」是严格 大…...

电商平台产品ID|CDN与预渲染|前端边缘计算

技术实现 都是通过ID拿到属性&#xff0c;进行预渲染html&#xff0c;通过 oss 分发出去 详情页这种基本都是通过 ssr 渲染出来&#xff0c;然后上缓存 CDN 分发到边缘节点来处理&#xff0c;具体逻辑可以参考 淘宝——EdgeRoutine边缘计算&#xff08;CDNServerless 边缘计算…...

LATTICE进阶篇DDR2--(4)DDR2 IP核总结

一、IP核的时钟框架 1片DDR2的接口是16位&#xff0c;且DDR2是双边沿读取的&#xff0c; 故当DDR2芯片的时钟为200M时&#xff0c;右侧DDR2芯片上的数据吞吐率为200M*2*16b&#xff0c;左侧数据吞吐率为200M*32b&#xff0c;左右两侧数据吞吐量相等。 根据上规律可知&#xf…...

windows下php安装kafka

下载zookeeper Kafka 依赖 Zookeeper 进行分布式协调&#xff0c;所以需要下载Zookeeper &#xff0c;当然你也可以使用kafka包里自带的一个默认配置的 Zookeeper。这里我们单独下载一个 访问Zookeeper官方下载页面在页面中找到最新的稳定版本&#xff0c;点击相应的下载链接…...

【wiki知识库】09.欢迎页面展示(浏览量统计)SpringBoot部分

&#x1f34a; 编程有易不绕弯&#xff0c;成长之路不孤单&#xff01; 大家好&#xff0c;我是熊哈哈&#xff0c;这个项目从我接手到现在有了两个多月的时间了吧&#xff0c;其实本来我在七月初就做完的吧&#xff0c;但是六月份的时候生病了&#xff0c;在家里休息了一个月的…...

数据分析与应用:微信-情人节红包流向探索分析

目录 0 需求描述 1 红包发送方用户的基本信息缺失率有多高?(即有多少红包发送方用户无法在用户基本信息表中匹配? 2 哪一组红包金额的拒收率最高? 3、最受二线城市欢迎的红包金额为?(即发出次数最多) 4 北上广深 4 大城市中,哪座城市的男性用户发出的 520 红包比例…...

SQL,获取 ID 的历史状态

sas系统的表tb存储病人的医疗历史记录&#xff0c;当Visit_codeSurgery时表示手术&#xff0c;Visit_codeOffice表示咨询&#xff0c;每个病人有多条Visit_code&#xff0c;有时只有Surgery或只有Office&#xff1a;IdVisit_DateVisit_codeA305/15/2004SurgeryA302/5/2005Offic…...

阅文集团:摇不动的IP摇钱树

把IP当成摇钱树&#xff0c;要做“东方迪士尼” 今天我们聊——阅文集团 《热辣滚烫》《庆余年2》《与凤行》和《玫瑰的故事》很熟悉吧&#xff1f;影视“四连爆”&#xff0c; 阅文集团交出一份亮眼半年报&#xff0c;时隔两年&#xff0c;重启增长。 跟IP相关业务对收入贡献…...

ETL数据集成丨将SQL Server数据同步至Oracle的具体实现

一、背景 在构建企业级数据架构时&#xff0c;将SQL Server数据库的数据同步至数仓数据库&#xff08;如Oracle&#xff09;是一项至关重要的任务。这一过程不仅促进了跨系统数据的一致性与可用性&#xff0c;还为数据分析、商业智能以及决策支持系统提供了坚实的数据基础。 …...

20240814软考架构-------软考51-55答案解析

每日打卡题51-55答案 51、【2017年真题】 难度&#xff1a;一般 系统移植也是系统构建的一种实现方法&#xff0c;在移植工作中&#xff0c; 需要最终确定移植方法。 A.计划阶段 B.准备阶段 C.转换阶段 D.验证阶段 答案&#xff1a;A 解析&#xff1a; 移植工作大体上分为计划…...

wordpress安装知更鸟主题/seo网站推广优化论文

In [24]: s4[s4 > 9000]Out[24]:数学 9001.0dtype: float64Series就先简要写到这&#xff0c;下面看pandas的另一种数据结构DataFrame.DataFrameDataFrame 是一种二维的数据结构&#xff0c;非常接近于电子表格或者类似 mysql 数据库的形式。它的竖行称之为 columns&#xf…...

亚洲杯篮球直播在什么网站/如何弄一个自己的网站

刚开始给idea上配置了一个tomcat&#xff0c;然后跟着http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/theme-settings.html 极客学院中提供的中文使用文档&#xff0c;配置呀配置&#xff0c;修改呀修改&#xff0c;我的编码方式呀&#xff0c;全都修改为UTF-8。…...

做移动端网站软件下载/哈尔滨网站优化流程

<?php// 添加应用模块实践class MessageAction extends Action{ //ThinkPHP特殊的操作方法 – 初始化 public function _initialize() { echo 每个操作都会先执行此方法逻辑内容<br /><br />; } // URL访问实践2 public function test2 () { …...

网站开发模块的需求/站长资源平台

2012-09-10 Eclipse 4.2发布之后&#xff0c;该版本与Eclipse 3.8之间的性能对比就成为了Eclipse社区中讨论最多的话题。 讨论最初由Cloudsmith创始人、Eclipse贡献者Thomas Hallgren引起&#xff0c;他称&#xff0c;他惊讶的发现&#xff0c;Eclipse 3.8的性能要比Eclipse 4.…...

网站建设小程序定制开发/seo站内优化教程

神经网络的基本单元是神经元&#xff0c;它是包括输入、连接、计算和输出功能的模型&#xff08;MP&#xff09;。其中&#xff0c;每个连接都对应一个权值&#xff0c;神经元在接受上一层神经元的不同输入信号后&#xff0c;通过对应的连接进行信号的加权传递&#xff0c;再利…...

省建设厅网站梁作庆/百度云搜索

是因为ID类型不对的缘故。 我这是因为传的是一个string类型的。...