位段 -- 内存布局详解-浅谈C语言

news/2025/3/18 8:56:04/文章来源:https://www.cnblogs.com/DSCL-ing/p/18341951

目录
  • 位段的介绍
  • 位段使用示例:
  • 位段的内存分配
  • Example
  • 内存分配解析:

## 位段

位段的介绍

位段(二进制位):就是按位存储

位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。

其中位段相较于结构体有两特殊点

  1. 位段的成员必须是 int unsigned int或 signed int char(整型家族) ,在C99中位段的成员也可以是其他类型
  2. 位段的成员名后跟一个冒号和数字

位段使用示例:

struct S
{int a : 2;  //限定2个比特位int b : 5;  //限定5个比特位int c : 10; //限定10个比特位int d : 30; //限定30个比特位
};

位段的内存分配

1.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。(...如,int一次开辟4字节32比特位来使用,不够再开辟)
2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。(网络编程涉及,网络传输数据包,)
(原因:没有C语言标准,各编译器有所不同。)
位段不能大于32(32位机器),16位则不能大于16位
不给定位段的默认为字节数

Example

struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};
int main()
{struct S s = { 0 };s.a = 10;// 1010 |  010s.b = 20;//10100 | 0100s.c = 3; //  011 |00011s.d = 4; //  100 | 0100return 0;
}

内存分配解析:

1. VS编译器为从左往右一次申请空间,一次1个字节/8个比特位-----> 申请空间方向 ----> 0000 0000 2. 然后开始存放a的数据10(D) = 1010(B),a限制为3个比特,多出的比特会被丢弃,即最后保留数据为010(B), --- vs中,每个字节内数据从右往左写入; 
(地址)  0000 0|0103. 放好a后,开始放b = 20(D) = 10100(B),b限制为4字节,切割b,得到b = 0100(B)第一空间放完a后,还剩5个比特,组以容纳b,因此在从四个字节开始(从右往左数),写入b
(地址)  0010 0010(b) 								= 22(h);
(划分)	0 | 0 1 0 0 | 0 1 0   b        a4. 接下来放c,c占5个比特位,显然第一个字节不够放了,因此要开辟第二个字节,然后切割c(不超过因此不用切),得到c = 011(b) ;
(地址)  0010 0010		0000 0011
(划分)  0 | 0 1 0 0 | 0 1 0     0 0 0 | 0 0 0 1 1   舍     b         a                  c5.接下来放d,d占4个字节,显然第2个字节不够放了,因此申请第三个字节,然后切割b,得到100(b);
(地址)  0010 0010		0000 0011 	0000 0100
(划分)	0 | 0 1 0 0 | 0 1 0     0 0 0 | 0 0 0 1 1     0 0 0 0 | 0 1 0 0 舍     b        a         舍        c                      d6.最后转换十六进制,得到22					   03						04   (十六进制)
即内存显示:22 03 047.还可能会有内存对齐,32位为 22 03 04 00 ....

image-20240804165014639

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chrome查看web socket消息

1. 打开目标页面 2. f12--》网络--》WS,然后刷新页面( 如果不刷页面,就会看不到 websocket 请求,因为 websocket 是长连接,页面加载后只发出一次连接请求,不像 http 接口,不用刷新页面,待会儿也能看到,因为 http 接口是短连接,调用一次发出一次请求 ),如下所示:

位段 -- 内存布局详解C语言

目录位段的介绍位段使用示例:位段的内存分配Example内存分配解析: ## 位段 位段的介绍位段(二进制位):就是按位存储位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。 其中位段相…

Java流程控制04:循环结构

顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,就需要使用循环结构。 Java中有三种主要的循环结构:while 循环 do…while 循环 for 循环1. while 循环 while是最基本的循环,它的结构为: while (布尔表达式) { // 循环内容 }只要布尔表达式为 true,循环…

虚拟机--共享文件夹

在宿主机创建一个文件夹 2.进入VM软件的设置->共享文件夹(从主机的文件夹添加)Linux中共享文件夹位置:/mnt/hgfs/ 路径下

001在vscode中创建flask项目框架

目录在vscode中创建flask项目1.配置flask环境2.导入以及创建flask框架 在vscode中创建flask项目 1.配置flask环境 先配置解释器然后再该虚拟环境下进行安装flask模块 进行该指令:pip install flask==版本号2.导入以及创建flask框架在桌面或者文件中建立一个文件夹将其移到vs c…

002.flask的基本使用

目录flask的基本使用1.基本使用2.传参的两种方式3.通过返回html网页来展示4.通过面向对象传参给html网页5.在html里面写条件语句6.在html中用循环7.总结 flask的基本使用 1.基本使用点三角形运行复制http://127.0.0.1:5000到浏览器上软后加上面的/index得到如下:可以给其添加d…

Spring学习(四)AOP分析

动态代理:代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 切面(aspectj),切面包含切点(pointCut)和增强方法(advice),对连接点(joinPoint,类的方法就是连接点),然后织入(Weaving),原始对象为代理对…

蒙特卡洛模拟(3)————求解有约束的非线性规划问题

目录前言一、问题提出二、蒙特卡罗模拟的大体思路1.求出每个变量的大致范围2.生成随机数进行模拟试验三、手动计算每个变量的大致范围1.处理等式问题————进行降维2.处理不等式问题————得到大致范围(1)先处理简单的约束,得到变量范围(2)对复杂的约束进行放缩,得到…

使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容

前言 这算是一篇学习记录博客了,主要是学习语义内核(Semantic Kernel)的实践,以及Aspire进行全栈开发的上手体验,我是采用Aspire同时启动API服务,Blazor前端服务以及WinUI的桌面端项目,同时进行三个项目的代码修改,整体感觉很方便,如果代码都修改了只需要启动Aspire项…

微信小程序3

1.样式文件1.小程序中不需要主动来引入样式文件2.px是写死的像素,不会变的,需要把页面中某些元素的单位由 px 变为 rpx1.设计稿 750px750px=750rpx 1px=1rpx2.把屏幕宽度变为375px375px=750rpx 1px=2rpx 1rpx=0.5px3.存在一个设计稿 宽度不和750成比例或者未知,…

Java流程控制02:顺序结构

JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。 顺序结构是最简单的算法结构。语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的, 它是任何一个算法都离不开的一种基本算法结构。 顺序结构在程序流程图中…

6-2训练模型的三种方法

Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异。Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异。 有三类典型的训练循环代码风格:脚本形式训练循环,函数形式训练循环,类型是训练循环。 下面以minis数据集的多分类模型的训练为例…