1、为什么要用位域?
在计算机中,有些信息存储时并不需要占用一个完整的字节,而只需占用一个或几个二进制位。比如在存放一个只有0和1两种状态的开关量时,用一位二进制位即可表示。因此,为了节省存储空间,C语言提供了一种称为“位域”的数据结构来充分利用存储空间。
位域的主要实现方式:把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数,每个域有一个域名,允许在程序中按域名进行操作,这样就可以将几个不同的对象用一个字节的二进制位域表示。
2、 如何定义
位域的定义与结构体定义相似,形式如下:
struct 位域结构名
{
类型说明符 位域名: 位域长度;
};
例如:
struct time
{
int a:8;
int b:2;
int c:6;
}data;//data为time变量,共占用2个字节
注:位域变量的说明与结构体变量的说明方式相同。可以先定义后说明、同时定义说明以及直接说明三种方式。
使用注意事项:
①、一个位域必须存储在同一个字节中,不能跨两个字节,如果一个字节所剩空间不够存放下一位域时,应该从下一个单元开 始,当然也可以有意调整使其从下一个单元开始;
struct data
{
unsigned a: 4;
unsigned :0;//空域,用0填充4位
unsigned b:4;
unsigned c:4;
};
②、位域长度不能大于一个字节的长度,即不能超过8位;
③、可以定义无名位域用来做填充或调整位置。
struct num
{
int a:1;
int :2;//无名位域,用来填充
int b:3;
int c:2:
};
3、如何调用
位域的调用方式和结构成员调用方式相同,形式为:
位域变量名 . 位域名
一个完整的例子如下:
#include<stdio.h>
int main()
{
struct test
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
}tst,*ptst;
tst.a = 6;
tst.b = 6;
tst.c = 6;
printf("a:%d,b:%d,c:%d\n",tst.a,tst.b,tst.c);
ptst = &tst;
ptst->a = 8;
ptst->b = 8;
ptst->c = 8;
printf("a:%d,b:%d,c:%d\n",ptst->a,ptst->b,ptst->c);
return 0;
}
综上:从本质上说,位域是一种结构类型,只不过其成员是按照二进制位来分配的。