1.位段的概念
所谓位段,就是指以位为单位定义长度的结构体类型中的成员。
eg:
struct packed-data
{
unsigned char a :2;
unsigned char b :6;
unsigned char c :4;
unsigned char d :4;
int x;
}data;
定义了一个结构变量data,其中的成员位段a,b,c,d分别占2位,6位,4位,4位,
成员x为整型,共占4个字节。
通过位段的定义,就可以单独对一个字节的某一位或某一段进行操作。这对单片机
来说,是非常有用的,特别是不我们设置寄存器时。
union io_pdr0
{
unsigned char byte;
struct{
unsigned char P00:1;
unsigned char P01:1;
unsigned char P02:1;
unsigned char P03:1;
unsigned char P04:1;
unsigned char P05:1;
unsigned char P06:1;
unsigned char P07:1;
}bit;
}P0;
这是一个关于P0口端口寄存器联合类型的定义,包括一个无符号字符变量byte和一个结构变量bit,结构变量中使用了位段的定义。从中可以看到,即可以对P0口写入一个字节,也可以对某一位单独赋值。例如:
P0.byte=0x80;
P0.bit.P00=1;
都是正确的。
2.有关位段的说明
(1)位段在存储单元中的空间分配方向为从右到左,如图所示:
图1 位段空间分配图
(2)可以定义无名位段。如:
Struct
{
unsigned char a:1;
unsigned char :2; (这两位空间不用)
unsigned char b:3;
unsigned char c:2;
}x;
图2 无名位段
如图所示,a和b之间的是无名位段,占2位,这两位的空间不用。
(3)位段的长度不能存储单元的长度,也不能定义位段数组。
(4)要注意位段允许的最大值范围。
如果定义位段占2位,那么最大值为3,超过这个范围的赋值,自动取赋值数的低位。
eg:
struct packed-data
{
unsigned char a :2;
unsigned char a :6;
}data;
引用位段中的数据时,例如:
data.a=2;
是正确的;
data.a=8;
是错误的。因为a只占2位,最大值为3。在此情况下,自动取8的低位。8的二进制数形式为1000,a只有2位,所以取1000的低2位,即取00,那么data.a的值为0。