位字段由一個結構體聲明建立,通過用signed int 或 unsigned int 中的一組相鄰的位表示。
這里假定int = 4字節,事實上大部分也是4字節--
按4字節對齊的話
struct { //unsigned int = 4byes = 0000 0000 x 4
unsigned aut:1; // = 1;;0000 0000 0000 0000 0000 0000 0000 0001
unsigned bld:1; // = 1;;0000 0000 0000 0000 0000 0000 0000 0010
unsigned und:1; // = 1;;0000 0000 0000 0000 0000 0000 0000 0100
} duct;
sizeof(duct) = 4
通過pragma 改變對齊字節,高位沒有用到的字節被截斷
#pragma pack(2)
struct { //unsigned int = 4byes = 0000 0000 x 4
unsigned aut:1; // = 1;; 0000 0000 0000 0001
unsigned bld:1; // = 1;; 0000 0000 0000 0010
unsigned und:1; // = 1;; 0000 0000 0000 0100
} duct;
#pragma pack()
sizeof(duct) = 2
#pragma pack(1)
struct { //unsigned int = 4byes = 0000 0000 x 4
unsigned aut:1; // = 1;; 0000 0001
unsigned bld:1; // = 1;; 0000 0010
unsigned und:1; // = 1;; 0000 0100
} duct;
#pragma pack()
sizeof(duct) = 1
匿名字段
可以通過匿名字段填充位
#pragma pack(2)
struct { //unsigned int = 4byes = 0000 0000 x 4
unsigned aut:1; // = 1;; 0000 0000 0000 0001
unsigned :2; // 下一個位將從(↓)4開始
unsigned bld:1; // = 1;; 0000 0000 0000 1000
unsigned und:1; // = 1;; 0000 0000 0001 0000
} duct;
#pragma pack()
sizeof(duct) = 2
另外將匿名字段寬度設置為0,將會強制下一個字段與一個整數對齊
#pragma pack(2)
struct { //unsigned int = 4byes = 0000 0000 x 4
unsigned aut:1; // = 1;; 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
unsigned :0; // 下一個位將從(↓)33開始
unsigned bld:1; // = 1;; 0000 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000
unsigned und:1; // = 1;; 0000 0000 0000 0010 0000 0000 0000 0000 0000 0000 0000 0000
} duct;
#pragma pack()
sizeof(duct) = 6
若剩下的位數不足以放下下一個字段要求的位寬度,將會自動補齊,如以下例子中all要求15位,而剩下的僅13位
#pragma pack(2)
struct { //unsigned int = 4byes = 0000 0000 x 4
unsigned aut:1; // = 1;;0000 0000 0000 0000 0000 0000 0000 0001
unsigned bld:1; // = 1;;0000 0000 0000 0000 0000 0000 0000 0010
unsigned und:1; // = 1;;0000 0000 0000 0000 0000 0000 0000 0100
// 從(↓)結束 從(↓)開始
unsigned all:15; // = 1;;0000 0000 0000 0000 0000 0000 0000 1000
└────填充的位──────┘
} duct;
#pragma pack()
sizeof(duct) = 4;
以上這些是在windows cygwin clion 的實驗下的結果,位字段有很強的機器依賴性,對于邊界對齊或位順序往往不一致。因此導致難以移植。