【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
 

相关内容

热门资讯

top等级胡瑾刑事律师团队:死... 在刑事法律领域,辩护律师的专业能力与经验直接关乎当事人的合法权益能否得到充分保障。随着法治建设的深入...
霸王茶姬90后创始人将成常州女... 来源:一波说传承有道 近日,一场即将举行的婚礼悄然成为财经圈与大众舆论场共同关注的焦点。 一张流传于...
常州法院2025年前三季度调解... 调解结案16474件、调解成功率24.08%——这是2025年前三季度常州法院交出的司法成绩单。通过...
安徽省政协研究室副主任陈鑫已任... 据铜陵市政府官网消息,11月20日上午,市委举行理论学习中心组学习会议,邀请省委社会工作部副部长高维...
原创 联... 据光明网报道,11月19日,在联合国大会的讨论中,日本企图争取成为安理会常任理事国的梦想再次破灭,令...
南部关于全县规范法律咨询服务机... 一、专项行动时间 自即日起至2025年12月。 二、举报受理范围 社会各界反映强烈的某些法律咨询服务...
“男子持刀入室盗窃”视频引发关... 近日,一段疑似“小偷”入室盗窃被业主家中监控拍下的视频在网上引发关注。11月21日晚,“翠屏公安”微...
绝不允许日本军国主义幽灵复活!... 2025年11月7日,日本首相高市早苗宣称,如果中国大陆对台湾出动军舰并使用武力,可能会构成“存亡危...
【解决】AI法律助手荣获202... 2025全球数字经济大会启幕,搭建国际数字合作高端平台 经国务院批准,由北京市人民政府、国家互联网信...