一、位字段的定义
位字段允许在结构体中按 位(bit) 为单位分配成员空间,用于紧凑存储布尔标志或小范围整数值,节省内存。常用于硬件寄存器操作、协议数据解析等场景。
二、位字段的语法
1. 基本声明
struct 结构体名 {类型 成员名 : 位宽;
};
- 类型:必须为整型(
int
、unsigned int
、signed int
)或兼容类型(如_Bool
)。 - 位宽:指定成员占用的位数(1~32,取决于类型长度)。
2. 示例
// 定义一个状态寄存器的位字段
struct StatusRegister {unsigned int error_flag : 1;// 1位:错误标志(0/1)unsigned int mode : 3;// 3位:模式(0~7)unsigned int reserved : 4;// 4位:保留位unsigned int value : 8;// 8位:数值(0~255)
};
三、位字段的内存布局
1. 存储单元分配
- 编译器将位字段按 存储单元(Storage Unit) 分组,通常为
int
大小(32位或64位)。 - 当多个位字段总位数不超过存储单元时,连续存放;否则开启新存储单元。
2. 内存对齐示例
struct Example {unsigned int a : 4;// 占用4位unsigned int b : 5;// 再占5位(同一存储单元)unsigned int c : 20;// 总位数超过32,开启新存储单元
};
// 总大小:4 + 5 + 20 = 29位 → 需要2个int(32位系统下占8字节)
小端存储:低位数据保存到低地址空间
struct S {unsigned char bit0 : 1;unsigned char bit1 : 1;unsigned char bit2 : 1;unsigned char bit3 : 1;unsigned char bit4 : 1;unsigned char bit5 : 1;unsigned char bit6 : 1;unsigned char bit7 : 1;//bit不能进行取地址操作
};
int main()
{struct S *p = NULL;unsigned char num = 0x12; //0001 0010p = (struct S *)#/*0 0 0 1 0 0 1 0bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0*/
}