位域的概念
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种数据结构,叫做“位域”或“位段”。
位域是操控位的一种方法(操控位的另一种方法是使用按位运算符,按位运算符将在之后的笔记中做介绍)。
位域通过一个结构声明来建立:该结构声明为每个字段提供标签,并确定该字段的宽度。例如,下面的声明建立了个4个1位的字段:
struct
{
unsigned int autfd:1;
unsigned int bldfc:1;
unsigned int undin:1;
unsigned int itals:1;
}prnt;
根据该声明, prnt包含4个1位的字段。现在,可以通过普通的结构成员运算符(.)单独给这些字段赋值:
prnt.itals = 0:
prnt.undin = 1;
由于每个字段恰好为1位,所以只能为其赋值1或0。变量prnt被储存在int大小的内存单元中,但是在本例中只使用了其中的4位。
:后面的数字用来限定成员变量占用的位数。位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。
//uint8_t modeSwitch : 2; 设定uint8_t modeSwitch的位的长度为2(即两位的长度),所以modeSwitch的赋值范围0~3
typedef struct _bt85_io_state_bt1_bit {
uint8_t modeSwitch : 2;
uint8_t drainWaterH : 2;
uint8_t dirSwitch : 2;
uint8_t drainWaterL : 2;
} bt85_io_state_bt1_bit;
typedef union _bt85_io_state_bt1_t {
uint8_t data;
bt85_io_state_bt1_bit bt1_data;
} bt85_io_state_bt1_t;