c语言struct中的域位
为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
使用位域的主要目的是压缩存储,其大致规则为:
1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
段将紧邻前一个字段存储,直到不能容纳为止;
2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
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值为最大成员大小的整数倍。

更多精彩