位域:
1 struct 位域结构名 2 { 位域列表 }; 3 4 比如 5 6 struct pack 7 { 8 unsigned a:2; 9 unsigned b:8; 10 unsigned c:6; 11 }pk1, pk2; 12 13 结构变量pk1或者pk2的3个成员将总共占用16位存储,其中a占用2位,b占用8位,c占用6位。
注:C语言中unsigned即表示unsigned int.
但是, 一个位域必须存储在同一个字节中,不能跨2个字节,当1个字节所剩空间不够存放另一个位域时,应从下一单元存入该位域。也可以有意使某位域从下一单元开始。例如:
1 struct bs 2 3 { 4 5 unsigned a:4; 6 7 unsigned :0; /*空域*/ 8 9 unsigned b:4; /*从下一单元开始存放*/ 10 11 unsinged c:4; 12 13 }
结构体内部成员的对齐
在计算结构体长度,尤其是用sizeof运算符时,需要注意根据不同的编译器和处理器,结构体内部的成员有不再的对齐方式,这会引起结构体长度的不确定性。
1 #include<stdio.h> 2 struct a 3 { 4 char a1; 5 char a2; 6 char a3; 7 }A; 8 9 struct b 10 { 11 short a2; 12 char a1; 13 }B; 14 15 int main() 16 { 17 printf( "sizeof(char) = %ld, sizeof(short) = %ld, sizeof(A) = %ld, sizeof(B) = %ld ", 18 sizeof(char), sizeof(short), sizeof(A), sizeof(B) ); 19 20 return 0; 21 }
在Trubo C中结果为:
1,2, 3,3