【C语言】位段(详解)
创始人
2025-05-30 23:24:14
0

目录

  • 1. 什么是位段
  • 2. 位段的内存分配

1. 什么是位段

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

位段的好处:

  • 位段可以使数据单元节省储存空间
  • 位段可以很方便的访问一个整数值的部分内容从而可以简化程序源代码

此外

  • 位段是定义在结构体中的
  • 位段成员数据类型可以是 int, unsigned int, signed int, char, unsigned char, signed char 类型
  • 位段空间是按需以4个(int型)或1个(char型)字节来开辟的
  • 位段不可跨平台,所以可移植的程序应避免使用位段
struct A
{int _a : 2;int _b : 3;char c : 1;char d : 4;
};

2. 位段的内存分配

对于下面这个结构体中的位段

struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};

内存分配图如下(VS环境)
在这里插入图片描述
 
 
注意:

  • 这里位段类型为char,所以当比特位不够时每次补充一个字节的空间
  • 位段存在跨平台的问题,当一个位段成员存储后的空余空间无法完整容纳下一个位段成员时,是将空余内存空间舍弃还是利用,是不确定的
  • 并且位段成员的内存是从左向右还是从右向左分配也是不确定的

与结构体将比,位段能够更大限度的节约内存空间,但是存在跨平台问题, 需谨慎使用。

 

练习:

unsigned char puc[4];struct tagPIM{unsigned char n;unsigned char a : 1;unsigned char b : 2;unsigned char c : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc,0,4);pstPimData->n = 2; pstPimData->a = 3;pstPimData->b = 4;pstPimData->c = 5;printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);

vs环境下其内存分布分析
在这里插入图片描述
即打印结果为 02 29 00 00
 

相关内容

热门资讯

桂林三金:聚焦生物制药进展与分... 财中社6月5日电桂林三金(002275)发布公告,近日公司举行了投资者关系活动,主要内容围绕生物制药...
海关法律师张严锋办案实务:仅偷... 上海走私案件律师张严锋:多次走私未达到“起刑点”也会构成走私犯罪 刘某因走私分别于2018年1月...
以法律规制促进平台用工算法向善 陈靖远 【析理论道】 随着数字技术的发展和平台经济的崛起,我国新就业形态劳动者群体规模持续扩大,在劳...
绍兴市持续深化驻村指导员制度赋... 林佳萍、裘一倩 连日来,在绍兴柯桥区兰亭街道谢家坞村,由兰亭文化旅游度假区投资3.9亿元建设的兰亭湖...
湖南芙蓉律师事务所组织开展第二... 6月4日下午,第二届“芙蓉律师杯”书画展作品评审活动在湖南芙蓉律师事务所44楼大会议室开展。活动由律...
系统治水 科技管水 制度护水 系统治水 科技管水 制度护水 十堰多措并举确保“一泓清水永续北送” 茅箭区茅塔河枧槽沟段生态湿地...
又要出新政策了 最近,有一种很强烈的感觉,6月我们极有可能会出台新的经济刺激政策。 其中, 一个涉及房地产,属于短期...
皇氏集团股份有限公司 关于诉讼... 本公司及董事会全体成员保证信息披露的内容真实、准确、完整,没有虚假记载、误导性陈述或重大遗漏。 特别...