结构体位域充分利用把结构体字节,以bite为单位。例如:存储性别,可以使用二进制0或1表示
1. 格式
struct 结构体位域名
{
数据类型 位域名:位域大小;
......
};
- 结构体位域名:满足命名规范
- 数据类型:不可以是float double,可以是char short int long longlong unsigned char...
- 位域名:满足命名规范,可有可无
- :; 均不可以省略
- 位域大小:不允许超过数据类型的位数
struct A
{
char a:1;
int b:2;
};
struct B
{
char a:3;
int :4; // 省略位域名,该4位不使用,默认使用0填充
short c:5;
};
2. 结构体位域的大小计算
-
总位数小于最宽成员的字节数
struct A
{
int a:8;
int b:6;
int c:2;
};
// 最宽成员int,4字节,32位
// 8+8+2<32 ,按32计算字节大小
-
总字节超过最宽成员的字节数,变量不可以跨字节存放
struct B
{
int a:20;
int b:15;
int c:10;
};
// 最宽成员int,4字节,32位
// a:20位,剩余12位,存放b空间就不够了,需要重新开辟最宽成员的字节大小,开辟32位
// b占用15位,c占用10位,剩余7位使用0填充
// 共8字节
-
数据类型不一致时,以最宽成员的字节进行开辟空间
struct C
{
char a:7;
int b:20;
long c:60; //8
char d:5;
};
// 最宽成员long,8字节,64位
// 7+20=27 64位剩余37位,不够存储c,所以重新开辟8字节的大小
// c占60位,剩余4位,但是d占5位不够存储,重新开辟8字节存储
// 共:24字节