为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

使用位域的主要目的是压缩存储,其大致规则为:
1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
段将紧邻前一个字段存储,直到不能容纳为止;
2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
1 struct test 
2 {
3     int a:8;
4     int b:2;
5     int c:6
6 }test_t;

 

sizeof(test_t) = 4;

其中 a 占 8 位,b占2位,c占6位。

 

可以存在无名位域

1 struct test 
2 {
3     int a:8;
4     int   :2;
5     int c:6
6 }test_t;

 

无名位域无法被引用,因为没有名字,可以用来填充或者调整位置

 

指针变量不能指定位数,因为指针变量的大小是固定的...

如果相邻的位域字段的类型不同,则各编译器的具体实现有差异

如果位域字段之间穿插着非位域字段,则不进行压缩

结构体sizeof值为最大成员大小的整数倍。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄