首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C 語言位域詳解:定義、存儲規則與實戰技巧

     編輯:C 語言基礎

什麼是位域

在結構中按**位**劃分成員,節省空間。適合開關量、標誌位、硬件寄存器映射。

定義語法

struct BitField {
    unsigned int a : 8;  // 佔 8 位
    unsigned int b : 2;  // 佔 2 位
    unsigned int c : 6;  // 佔 6 位
} data;  // 共 16 位 = 2 字節

存儲規則

  1. 不跨字節:剩餘位不足容納下一位域 → 自動從下一字節開始
  2. 長度 ≤ 8 位(單字節)
  3. 無名位域:僅作填充/對齊,不可訪問
    struct {
        unsigned a : 4;
        unsigned   : 0;  // 強制換行到下一字節
        unsigned b : 4;  // 從新字節起存
        unsigned c : 4;
    };
  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;
}

應用場景

  • 網絡協議頭部解析(TCP Flags 等)
  • 硬件寄存器映射(嵌入式)
  • 壓緊標誌位組(如文件屬性:只讀、隱藏、系統、歸檔)
注意:位域在結構中的**分配順序**(低位→高位 或 高位→低位)由編譯器實現定義,跨平台時需謹慎。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved