经典C语言面试题3:位域。

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

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;
}


综上:从本质上说,位域是一种结构类型,只不过其成员是按照二进制位来分配的。





你可能感兴趣的:(C语言基础&面试常见问题,常见C语言面试题,位域,作用)