在結構中按**位**劃分成員,節省空間。適合開關量、標誌位、硬件寄存器映射。
struct BitField {
unsigned int a : 8; // 佔 8 位
unsigned int b : 2; // 佔 2 位
unsigned int c : 6; // 佔 6 位
} data; // 共 16 位 = 2 字節
struct {
unsigned a : 4;
unsigned : 0; // 強制換行到下一字節
unsigned b : 4; // 從新字節起存
unsigned c : 4;
};
unsigned : 2; 佔 2 位不可用同結構體成員:var.member 或 ptr->member。可參與位運算(&、|、^、~、<<、>>)。
struct BS {
unsigned a : 1;
unsigned b : 3;
unsigned c : 4;
} bit, *pbit;
int main() {
bit.a = 1; bit.b = 7; bit.c = 15;
printf("%d,%d,%d\n", bit.a, bit.b, bit.c); // 1,7,15
pbit = &bit;
pbit->a = 0;
pbit->b &= 3; // 7 & 3 = 3
pbit->c |= 1; // 15 | 1 = 15
printf("%d,%d,%d\n", pbit->a, pbit->b, pbit->c); // 0,3,15
return 0;
}
注意:位域在結構中的**分配順序**(低位→高位 或 高位→低位)由編譯器實現定義,跨平台時需謹慎。