首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月04日 16:01

目录

## 位段

位段的介绍

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

位段(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 |  010
    s.b = 20;//10100 | 0100
    s.c = 3; //  011 |00011
    s.d = 4; //  100 | 0100
    return 0;
}

内存分配解析:

1. VS编译器为从左往右一次申请空间,一次1个字节/8个比特位
 -----> 申请空间方向 ----> 
  0000 0000 

2. 然后开始存放a的数据10(D) = 1010(B),a限制为3个比特,多出的比特会被丢弃,即最后保留数据为010(B), 
 --- vs中,每个字节内数据从右往左写入; 
(地址)  0000 0|010

3. 放好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        a

4. 接下来放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                  c

5.接下来放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                      d

6.最后转换十六进制,得到
    22					   03						04   (十六进制)
即内存显示:22 03 04

7.还可能会有内存对齐,32位为 22 03 04 00 ....

image-20240804165014639

From:https://www.cnblogs.com/DSCL-ing/p/18341951
本文地址: http://www.shuzixingkong.net/article/770
0评论
提交 加载更多评论
其他文章 HTML 编辑器
使用像Notepad(在Windows上)或TextEdit(在MacOS上)这样的基本文本编辑器来学习HTML是一个非常棒的开始。这些工具虽然简单,但足以让你编写并查看基本的HTML代码,帮助你理解HTML的结构和语法。下面我将详细解释每一步,确保你能成功创建并查看你的第一张HTML网页。 步骤一
ComfyUI插件:ComfyUI layer style 节点(四)
前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度、饱和度、对比度
ComfyUI插件:ComfyUI layer style 节点(四) ComfyUI插件:ComfyUI layer style 节点(四) ComfyUI插件:ComfyUI layer style 节点(四)
推荐3款免费且实用的数据库管理工具
前言 数据库在日常工作中确实扮演着至关重要的角色,无论是数据管理、分析还是应用开发,都离不开它的支持。今天大姚给大家分享3款免费且实用的数据库管理工具,希望可以帮助到有需要的同学。 DBeaver DBeaver是一款免费的跨平台数据库工具,适用于开发人员、数据库管理员、分析师和所有数据处理人员。它
推荐3款免费且实用的数据库管理工具 推荐3款免费且实用的数据库管理工具 推荐3款免费且实用的数据库管理工具
Rust项目的代码组织
学习一种编程语言时,常常优先关注在语言的语法和标准库上,希望能够尽快用上新语言来开发,我自己学习新的开发语言时也是这样。 不过,想用一种新的语言去开发实际的项目,或者自己做点小工具的话,除了语言本身之外,了解它在项目中如何组织代码也是至关重要的。毕竟在实际项目中,不可能像学习语言时那样,常常只有一个
Rust项目的代码组织 Rust项目的代码组织 Rust项目的代码组织
使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容
前言 这算是一篇学习记录博客了,主要是学习语义内核(Semantic Kernel)的实践,以及Aspire进行全栈开发的上手体验,我是采用Aspire同时启动API服务,Blazor前端服务以及WinUI的桌面端项目,同时进行三个项目的代码修改,整体感觉很方便,如果代码都修改了只需要启动Aspir
使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容 使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容
使用 C# 和 ONNX 來玩转Phi-3 SLM
LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电脑、手机等设备来运行,小型语言模型 (SLM) 和 ONNX 的结合改变了 AI 互操作性的游戏规则
使用 C# 和 ONNX 來玩转Phi-3 SLM 使用 C# 和 ONNX 來玩转Phi-3 SLM
使用python对Excel表格某个区域保存为图片
实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。 python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下: pyexcel:pye
使用python对Excel表格某个区域保存为图片 使用python对Excel表格某个区域保存为图片
三.mysql问答合集
目录三.MySQL3.1 关系型和非关系型数据库的区别关系型数据库非关系型数据库3.2 登录数据库的方式,如何远程登录3.3 MySQL的服务结构,当客户端发起请求后,处理过程3.4 如何设置或者重置MySQL密码3.5 DDL,DML,DQL,DCL等SQL语句的写法DDL数据定义语句DCL数据控
三.mysql问答合集 三.mysql问答合集 三.mysql问答合集