所有基礎的資料類型, 最大的也不過 10 個位元組;
我們可以自訂的資料類型 -- "結構", 通過把若干類型組合在一起, 讓一種類型可以大很多.
我們知道, 一個位元組有八個 Bit 組成; 能否把一種類型縮小、縮小到 Bit 級?
結構中的 "位欄位" 是以 Bit 為單位的, 這已經是電腦的最小單位, 大小是 char 類型的 1/8.
下面的例子中定義的位欄位, 分別有 1-4 Bit 大小; 1 Bit 的欄位只能放兩個數(0、1), 4 Bit 的欄位也只能放下 16 個數:
1. 結構體可以包含位欄位:
#include <stdio.h>int main(void){ struct Bit { unsigned a: 1; /* 1 Bit, 取值範圍: 0 - 1 */ unsigned b: 2; /* 2 Bit, 取值範圍: 0 - 3 */ unsigned c: 3; /* 3 Bit, 取值範圍: 0 - 7 */ unsigned d: 4; /* 4 Bit, 取值範圍: 0 - 15 */ } B; B.a = 1; B.b = 3; B.c = 7; B.d = 15; printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d); getchar(); return 0;}
上例中, 位域的類型被指定為是無符號的整型(unsigned int), 我試著只要是整型都可以, 但要一致.
假如我們定義 8 個欄位, 每個欄位都是 1 Bit, 就可以很好地明細一個位元組, 譬如:
11111111B = 255;
00000001B = 1;
00001111B = 15;
01111111B = 127;
下面的例子用程式對上面的說明做了落實:
2. 用 8 個 Bit 構成一個 unsigned char 數:
#include <stdio.h>int main(void){ struct Bit { int b8: 1; int b7: 1; int b6: 1; int b5: 1; int b4: 1; int b3: 1; int b2: 1; int b1: 1; } B; unsigned char *p = NULL; B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 255 */ B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 1 */ B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 15 */ B.b1 = 0; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 127 */ getchar(); return 0;}
3. 包含位欄位的結構和其他結構沒有區別, 譬如同時包含其他類型的欄位:
#include <stdio.h>int main(void){ struct Bit { unsigned b1: 1; unsigned b2: 1; float f; } B; B.b1 = 0; B.b2 = 1; B.f = 3.14; printf("%d, %d, %g\n", B.b1, B.b2, B.f); getchar(); return 0;}