位字段是唯一打包在字節(jié)中的對象。也就是說,兩個位字段可存儲在同一字節(jié)中。位字段的大小可以從 1 位到 32 位不等,但它們從不跨越 4 字節(jié)邊界。
對于大端模式,位字段按定義的順序從最高有效位 (MSB) 到最低有效位 (LSB) 打包到寄存器中。位字段按從最高有效字節(jié) (MSbyte) 到最低有效字節(jié) (LSbyte) 的順序打包到內(nèi)存中。對于小端模式,位字段按照定義的順序從 LSB 到 MSB 打包到寄存器中,并按照從 LSbyte 到 MSbyte 的順序打包到內(nèi)存中。
以下是有關(guān)如何處理位字段的一些詳細(xì)信息:
- 純文本 int 位字段是無符號的??紤]以下 C 代碼:
struct st
{
int a:5;
} S;
foo()
{
if (S.a < 0)
bar();
}
在此示例中, bar()永遠(yuǎn)不會被調(diào)用,因為位字段“a”是無符號的。如果需要有符號位字段,請使用 signed int。
- 支持 long long 類型的位字段。
- 位字段被視為聲明的類型。
- 包含位字段的結(jié)構(gòu)的大小和對齊方式取決于位字段的聲明類型。例如,考慮以下結(jié)構(gòu):
struct st {int a:4};
此結(jié)構(gòu)使用了 4 個字節(jié)并在 4 個字節(jié)處對齊。
- 未命名的位字段會影響結(jié)構(gòu)或聯(lián)合體的對齊方式。例如,考慮以下結(jié)構(gòu):
struct st{char a:4; int :22;};
此結(jié)構(gòu)使用了 4 個字節(jié)并在 4 字節(jié)邊界處對齊。
- 根據(jù)位字段的聲明類型訪問聲明為易失性的位字段。易失性位字段引用只生成一個對其存儲的引用;多個易失性位字段訪問不會被合并。
圖 6-4 使用以下位字段定義說明位字段打包:
struct{
int A:7
int B:10
int C:3
int D:2
int E:9
}x;
A0 表示字段 A 的最低有效位;A1 表示下一個最低有效位,以此類推。同樣,位字段在內(nèi)存中的存儲是通過逐字傳輸而不是逐位傳輸完成的。
| A | A | A | A | A | A | A | B | B | B | B | B | B | B | B | B | B | C | C | C | D | D | E | E | E | E | E | E | E | E | E | X |
| 6 | 5 | 4 | 3 | 2 | 1 | 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 2 | 1 | 0 | 1 | 0 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | X |
| 字節(jié) 0 | 字節(jié) 1 | 字節(jié) 2 | 字節(jié) 3 |
| A | A | A | A | A | A | A | B | B | B | B | B | B | B | B | B | B | C | C | C | D | D | E | E | E | E | E | E | E | E | E | X |
| 6 | 5 | 4 | 3 | 2 | 1 | 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 2 | 1 | 0 | 1 | 0 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | X |
| X | E | E | E | E | E | E | E | E | E | D | D | C | C | C | B | B | B | B | B | B | B | B | B | B | A | A | A | A | A | A | A |
| X | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 1 | 0 | 2 | 1 | 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 字節(jié) 0 | 字節(jié) 1 | 字節(jié) 2 | 字節(jié) 3 |
| B | A | A | A | A | A | A | A | B | B | B | B | B | B | B | B | E | E | D | D | C | C | C | B | X | E | E | E | E | E | E | E |
| 0 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 1 | 0 | 1 | 0 | 2 | 1 | 0 | 9 | X | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
| 圖例:X = 未使用,MS = 最高有效,LS = 最低有效 |