位字段是唯一打包在字节中的对象。也就是说,两个位字段可存储在同一字节中。在 C语言中,位字段的大小可以从 1 位到 64 位不等,在 C++ 语言中则可以更大。
对于大端模式,位字段按定义的顺序从最高有效位 (MSB) 到最低有效位 (LSB) 打包到寄存器中。位字段按从最高有效字节 (MSbyte) 到最低有效字节 (LSbyte) 的顺序打包到内存中。对于小端模式,位字段按照定义的顺序从 LSB 到 MSB 打包到寄存器中,并按照从 LSbyte 到 MSbyte 的顺序打包到内存中。
位字段的大小、对齐方式和类型遵循以下规则:
图 6-6 使用以下位字段定义说明位字段打包:
struct{
int A:7
int B:10
int C:3
int D:2
int E:9
}x;
A0 表示字段 A 的最低有效位;A1 表示下一个最低有效位,以此类推。同样,位字段在内存中的存储是通过逐字传输而不是逐位传输完成的。
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 |
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 |
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 = 最低有效 |