int a : 3 vs 普通 int 的本質差異在 struct 或 union 中,成員後加 : 寬度 即宣告位元欄位:
struct Flags {
unsigned int flag1 : 1; // 1 bit
unsigned int flag2 : 3; // 3 bits
unsigned int flag3 : 4; // 4 bits
};
int 的核心差異| 特性 | 普通 int | 位元欄位 int a : n |
|---|---|---|
| 佔用空間 | 固定 sizeof(int)(通常 4 位元組) | 僅佔 n bits,編譯器盡量壓縮相鄰欄位至同一儲存單元 |
| 可取址 | 可用 &a 取得位址 | 不可取址(&a 編譯錯誤),因可能跨位元組邊界 |
| 陣列化 | 可宣告陣列 int arr[10] | 不可宣告陣列 |
| 型別限制 | 任意型別 | 僅限 int, unsigned int, signed int, _Bool (C99) 或實作定義型別 |
| 存取速度 | 直接載入/儲存字長 | 需額外位元遮罩/位移指令,**稍慢** |
| 攜帶性 | 高 | 位元配置順序(高位在前/低位在前)、跨儲存單元行為由**實作定義** |
#include <stdio.h>
struct DeviceStatus {
unsigned int power_on : 1;
unsigned int error : 1;
unsigned int mode : 3; // 0-7
unsigned int reserved : 29; // 填滿 32 bits
};
int main() {
struct DeviceStatus s = {0};
s.power_on = 1;
s.mode = 5;
printf("Size: %zu bytes\n", sizeof(s)); // 輸出 4
// s = *(struct DeviceStatus*)&hardware_register; // 硬體映射
return 0;
}
int f : 1)正負號表示實作定義,旗標請用 unsigned。unsigned int : 0)強制對齊到下一個儲存單元,可用於對齊控制。val & (1<<n)),可讀性、攜帶性、除錯友善度全勝。