當資料只需幾個位元(如開關狀態 0/1)時,佔用完整位元組顯得浪費。C 語言提供位域(Bit-field),可將一個位元組劃分為多個命名區域,各佔指定位元數,以節省空間並簡化操作。
語法與結構體類似:
struct 位域結構名 {
型別 位域名 : 位域長度;
// ...
};
範例:
struct bs {
int a : 8;
int b : 2;
int c : 6;
} data; // 共佔 2 位元組
int 通常 32 位,但實際受限於位元組邊界)。struct A { int a : 5; int b : 3; };
int main() {
char str[100] = "0134324324afsadfsdlfjlsdjfl";
struct A d;
memcpy(&d, str, sizeof(A));
printf("%d\n%d\n", d.a, d.b);
}
32 位 x86 輸出:-16 和 1。
解析:
int 4 位元組),故 sizeof(A) == 4。memcpy 將字串前 4 位元組 '0','1','3','4'(ASCII 0x30,0x31,0x33,0x34)拷入 d 低位元組。0x30 = 00110000,低 5 位 10000(有號擴展為 -16),高 3 位 001(擴展為 1)。系統先依對齊規則分配空間並填充,再進行位域操作。
struct ch1 { int a:1; int b:2; int c:5; } data1;
struct ch2 { char a:8; unsigned char b:7; char c:6; char d:3; char e:2; unsigned char f:1; int g; } data2;
struct ch3 { char a,b,c,d,e,f; int g; } data3; // 無位域版
printf("size: data1=%d data2=%d data3=%d\n", sizeof(data1), sizeof(data2), sizeof(data3));
// 輸出:4 8 12
data2 以位域壓縮 6 個 char 為 1 位元組,加上 int g 對齊至 4 位元組,共 8 位元組;data3 直排 6+4=10 位元組,對齊至 12 位元組。