有些信息只需要占一个或者几个二进制位,不需要占用一个完整的字节,为节省空间,所以产生了位段结构。位段就是把一个字节中的二进制划分为几个不同的区间,并说明每个区段的位数每个段有一个段名,允许在程序中按段名进行操作,这样就可以把几个不同的对象用一个字节的二进制位段来表示。
位段的声明和位段变量的声明相仿:
Struct 位段结构名
{
位段表
};
位段表的形式如下:
类型说明符 位段名:位段长度;
例如
struct PackDataType
{
unsigned a:2;
unsigned b:6;
unsigned c:5;
unsigned d:3;
unsigned e:8;
unsigned f:4;
unsigned g:4;
};
位段的定义与结构变量的定义相同:
1先声明位段类型后定义位段变量
struct PackedDataType
{
unsigned a:2;
unsigned b:6;
unsigned c:5;
unsigned d:3;
unsigned e:3;
unsigned f:8;
unsigned h:4;
unsigned g:4;
};
struct PackedDataType data;//<span style="font-family:宋体;">位段变量的定义
</span>
2在声明位段类型时定义位段变量
struct PackedDataType
{
unsigned a:2;
unsigned b:6;
unsigned c:5;
unsigned d:3;
unsigned e:3;
unsigned f:8;
unsigned h:4;
unsigned g:4;
}data;
3直接定义位段变量
struct
{
unsigned a:2;
unsigned b:6;
unsigned c:5;
unsigned d:3;
unsigned e:3;
unsigned f:8;
unsigned h:4;
unsigned g:4;
}data;
上面data为PackedDataType型变量,共占4个字节,
对于位段的定义的2点说明
1位段可以无位段名,这是它只能用来做填充或调整位置,无名的位段是不能使用的,0宽度的无名段位段用来使下一个位段从新的字节起始位置开始存贮
2一个位段必须存贮在同一个字节中,不能跨2个字节。屄图一个字节所剩空间不够存放另一段时,将从下一字节起存放此位段,也可以有意使某位段从下一字节开始
struct PackedDataType
{
unsigned a:2;<span style="font-family:宋体;">//位段长度为2</span>
unsigned :0;<span style="font-family:宋体;">//0宽度无名位段,使下一位段从下一个字节起始位置开始存贮</span>
unsigned b:5;<span style="font-family:宋体;">//存贮在第2个字节中</span>
unsigned c:8;<span style="font-family:宋体;">//位段不能跨字节存放,存贮在第3个字节中</span>
unsigned d:4;
unsigned e:4;
};
注意:1应为位段不允许跨字节存贮所以位段的长度不能大于一个字节的长度,也就是位段长度不能超过8位二进制
2位段在本质上是一种结构类型,只不过成员是按二进制分配的
3位段成员必须是int或者unsigned类型的