当前位置:   article > 正文

【C语言】位段(详解)_c语言 位段

c语言 位段

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;
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2. 位段的内存分配

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

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

内存分配图如下(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]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

vs环境下其内存分布分析
在这里插入图片描述
%02x 以16进制位打印,打印两位,不够两位用0填充
(%2x 以16进制位打印,打印两位,不够两位用空格填充)
即打印结果为 02 29 00 00
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/515892
推荐阅读
相关标签
  

闽ICP备14008679号