經典C語言面試題3:位域。
阿新 • • 發佈:2019-02-12
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; }
綜上:從本質上說,位域是一種結構型別,只不過其成員是按照二進位制位來分配的。