首页 > 系统相关 >位段 -- 内存布局详解-浅谈C语言

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

时间:2024-08-04 17:07:44浏览次数:14  
标签:字节 比特 -- 32 C语言 位段 int 内存 浅谈

目录

位段

位段的介绍

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

位段(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

位段的跨平台问题

  1. int位段被当成有符号数还是无符号数没有规定(最高位1当成什么不确定)
  2. 位段中最大位的数目不能确定(16位机器最大为16,32位机器最大32。写成27,在16位机器会出问题
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配没有规定(00001111还是11110000)
  4. 当一个结构体包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时,不确定是舍弃剩余位还是利用。(按类型字节开辟的位不够放时,VS中是舍弃)

跟结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

标签:字节,比特,--,32,C语言,位段,int,内存,浅谈
From: https://www.cnblogs.com/DSCL-ing/p/18341951

相关文章

  • Java流程控制05:break & continue
    1.break关键字break主要用在循环语句或者switch语句中,用来跳出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。【演示:跳出循环】publicstaticvoidmain(String[]args){ inti=0; while(i<100){ i++; System.out.println(i); if(i==......
  • go高并发之路——消息中间件kafka(中)
    接着上篇,我们继续聊聊kafka的那些事儿。一、消费者组消费者组,即ConsumerGroup,是Kafka的一大亮点设计。一个组内可以有多个消费者或消费者实例(ConsumerInstance),它们共享一个公共的ID,这个ID被称为GroupID。组内的所有消费者协调在一起来消费订阅主题(topic)的所有分区(Part......
  • 如何为每个组保留预定义的不同行数?
    我有一个包含几列的数据框。我想按城市订购并保留'city'=='BuenosAires'一定数量的行。对于'city'=='Paris',还有另一个行数。有没有办法做到这一点?这里显示了一种为每个组保持相同行数的方法,但我想要不同的行数。citynumber0......
  • ros 一键 之 rosdep
    #-*-coding:utf-8-*-from.baseimportBaseToolfrom.baseimportPrintUtils,CmdTask,FileUtils,AptUtils,ChooseTaskfrom.baseimportosversionfrom.baseimportrun_tool_fileclassTool(BaseTool):def__init__(self):self.type=BaseTool.T......
  • 基于nodejs+vue家庭财务管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着家庭经济的不断发展和复杂化,家庭成员间的财务管理逐渐成为一项重要而繁琐的任务。传统的手工记账方式不仅效率低下,而且难以实现家庭成员间财务信息的共......
  • 基于nodejs+vue家庭财务管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代家庭经济的日益复杂,家庭成员对于个人及家庭财务状况的掌握与管理需求日益增长。传统的财务管理方式往往依赖于纸质账本或简单的电子表格,这种方式不......
  • 配置 Pytest 以跨多个项目目录查找测试
    我希望使用pytest对项目中的所有AWSLambda代码进行单元测试。由于我必须配置目录结构才能与基础设施即代码工具一起使用,每个Lambda都位于它自己的CloudFormation堆栈中,因此我有一个相当非标准的目录结构。我无法让pytest在我的所有Lambda函数中运行所有测试-理想......
  • 基于nodejs+vue家庭财务管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着社会经济的快速发展和家庭结构的多元化,家庭财务管理成为每个家庭日常生活中不可或缺的一部分。然而,传统的手工记账方式已难以满足现代家庭对财务管理高......
  • 多线程-进阶2
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库JavaEE专栏:JavaEE关注博主带你了解更多数据结构知识1.CAS1.1CAS全称:Compareandswap比较内存和cpu寄存器中的内容,如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容)......
  • 基于nodejs+vue家庭健康预警系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和人口老龄化的加剧,家庭成员的健康问题日益成为社会各界关注的焦点。传统的健康管理方式往往依赖于个人自觉和定期体检,但在面对突发......