5.3.8 C51的位结构

位结构是C51语言中的一种特殊结构,可以用于访问一个字节或字的多个位。位结构定义的一般形式如下。


struct位结构名

{

数据类型变量名:整型常数;

数据类型变量名:整型常数;

}位结构变量;


其中,struct为关键字,位结构中的数据类型必须是整型int(unsigned或signed);整型常数必须是非负的整数,范围是0~15,用于表示有多少位,即表示二进制位的个数;变量名是可选项,可以不省略。位结构的定义,示例如下。


struct

{

unsigned LBit:8;//LBit占用低字节的0~7共8位

unsigned HBit0:3;//HBit1占用高字节的0~3位共4位

unsigned HBit1:3;//HBit2占用高字节的4~6位共3位

unsigned HBit2:1;//HBit3占用高字节的第7位

}Bit;


位结构成员的访问与结构成员的访问相同,例如访问上例位结构中的LBit成员可写成如下形式。


Bit.LBit


在C51程序中按位访问数据时,采用位结构比使用位运算符方便。在使用位结构时,应注意以下几点。

❑位结构中的成员既可以定义为unsigned,也可定义为signed。

❑当位结构中的成员长度为1时,将被认为是unsigned类型,因为单个位不可能有符号。

❑位结构总长度(位数)是各个位成员定义的位数之和,可以超过两个字节。

❑位结构中的成员不能使用数组和指针型变量,但位结构变量可以是数组和指针。如果是指针,其成员访问方式同结构指针一样。

❑位结构可以成为嵌套式结构的成员,与其他结构成员一起使用,示例如下。


struct student//定义结构

{

char*name;//姓名

int num;//学号

int age;//年龄

char*sex;//性别

float score;//成绩

unsigned register:1;//是否注册,占用1位

unsigned pay:1;//是否交费,占用1位

};


本例中的结构定义了学生的信息。其中包含有两个位结构成员,第1个成员register表示该学生是否已经注册,第2个成员pay表示该学生是否已经缴纳学费。每个位结构成员只占用一位,但却可以表示两个信息,由此可见,合理使用位结构可以节省存储空间。