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

C 語言位段完整指南:定義、使用規則與記憶體佈局詳解

     編輯:關於C

什麼是位段?

位段以位為單位定義結構體成員佔用空間,既能節省空間,又方便位元操作。含位段的結構稱為位段結構。

語法格式

type [var]: digits
  • type:僅限 int、unsigned int、signed int
  • var:可選,可省略(無名位段)
  • digits:佔用二進制位數

定義範例

struct node {
    unsigned int a:4;   // 位段 a,佔 4 位
    unsigned int  :0;   // 無名位段,佔 0 位(強制對齊)
    unsigned int b:4;   // 位段 b,佔 4 位
    int c:32;           // 位段 c,佔 32 位
    int   :6;           // 無名位段,佔 6 位
};

使用規則(8 大注意事項)

  1. 型別僅限 int、unsigned int、signed int
  2. 位數不可超過基本型別最大位數(VC 中 int 32 位)
  3. 無名位段不可存取,但佔空間
  4. 不可對位段取址(&)
  5. 位數為 0 的位段必須是無名,下一位段從新儲存單元開始
  6. 位段用於運算式時自動整型提升為 int/unsigned int
  7. 賦值勿超過位段表示範圍,否則結果未定義
  8. 位段不能組成陣列

記憶體儲存原則(VC 環境,位段儲存單元 = 4 位元組)

  1. 若單一儲存單元能容納所有成員,全部放在同一單元;否則剩餘成員放入下一單元
  2. 唯一一個 0 位無名位段:C 佔 0 位元組,C++ 佔 1 位元組;其他情況至少佔一個儲存單元

實測程式與結果分析

typedef struct { unsigned int a:1; } S;           // 4 Bytes
typedef struct { unsigned int :0; } S1;           // C:0, C++:1
typedef struct { unsigned int a:1; unsigned int :0; unsigned c:32; } S2; // 8 Bytes
typedef struct { unsigned int a:4; unsigned int :0; int :6; unsigned c:32; } S3; // 12 Bytes
typedef struct { unsigned int a:1; char b; int c:1; int d:2; unsigned int e:2; } S4; // 4 Bytes

輸出結果

1 -1 -2 3
4 1 8 12 4

異常值解析

  • c 只有 1 位(符號位),賦 1 後符號擴展為 -1
  • d 佔 2 位,賦 2(二進制 10)符號擴展為 0xFFFFFFFE = -2

結構體大小計算口訣

  1. 成員依序排列,各自對齊到其型別位數
  2. 遇 :0 強制換到下一儲存單元
  3. 結構體總大小必須是最寬成員對齊值的整數倍
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved