C语言:位结构体
位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。一、位结构—简介有些信息在存储时并不需要占用一个完整的字节 而只需占几个或一个二进制位。例如在存放一个开关量时只有0和1 两种状态 用一位二进位即可。为了节省存储空间并使处理简便C语言又提供了一种数据结构称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域 并说明每个区域的位数。每个域有一个域名允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。二、位结构—定义1. 声明位结构体类型一般形式具体如下struct位结构体名{数据类型 变量名:整型常数;数据类型 变量名:整型常数;};说明数据类型必须是unsigned和signed可修饰的类型(char,short,int,long)。变量名是选择项, 可以不命名, 这样规定是为了排列需要。整型常数必须是非负的整 数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。2. 定义位结构体变量举例说明如下structbit{inta:1;//第0位intb:2;//第1,2位intc:3;//第3,4,5位intd:4;//第6,7,8,9位inte:6;//第10,11,12,13,14位}temp;注意位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。位结构成员可以与其它结构成员一起使用。三、位结构—使用方法位结构体变量的赋值和一般结构体赋值的方法是一样的。初始化定义时—赋值structbit{inta:1;//第0位intb:2;//第1,2位intc:3;//第3,4,5位intd:4;//第6,7,8,9位inte:6;//第10,11,12,13,14,15位}temp{1,3,6,10,26};初始化后—赋值temp.a1;temp.b3;temp.c6;temp.d10;temp.e26;位结构体的使用说明举例如下#includestdio.hstructbit{inta:1;//第0位intb:2;//第1,2位intc:3;//第3,4,5位intd:4;//第6,7,8,9位inte:6;//第10,11,12,13,14,15位}temp{1,3,6,10,26};intmain(intargc,char*argv[]){inti*((int*)temp);printf(0x%x\n,i);return0;}运行结果如下0x6ab7解释说明变量15 14 13 12 11 109 8 7 65 4 32 10a(1)1b(3)1 1c(6)110d(10)1010e(26)011010结果是0b01101010101101110x6ab7四、位结构和共用体联合使用具体程序如下#includestdio.htypedefunion{intdata;struct{inta:1;//第0位intb:2;//第1,2位intc:3;//第3,4,5位intd:4;//第6,7,8,9位inte:6;//第10,11,12,13,14,15位}bit;}_MQ;_MQ mq{.bit.a1,.bit.b3,.bit.c6,.bit.d10,.bit.e26};intmain(intargc,char*argv[]){printf(data0x%x\n,mq.data);return0;}运行结果如下