1、定义声明
位段成员必须声明为int
、unsigned int
或signed int
类型(short
char
long
)。位域的定义和位域变量的说明位域定义与结构定义类似,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为:
类型说明符 位域名:位域长度
例如,
struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; }
也可以这样定义:
struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; } pack;
使用示例如下:
#include <iostream> using namespace std; #include <string.h> struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; } pack; int main() { cout << (int) sizeof(struct packed_struct) << endl; return 0; }
2、位域的作用及存储规则
使用位域的主要作用是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof
大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof
大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++,GCC采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。