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表示该学生是否已经缴纳学费。每个位结构成员只占用一位,但却可以表示两个信息,由此可见,合理使用位结构可以节省存储空间。