1. 程式人生 > >經典C語言面試題3:位域。

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

綜上:從本質上說,位域是一種結構型別,只不過其成員是按照二進位制位來分配的。