首先来看两个结构体:
struct s1
{
int i : 8;
int j : 4;
int a : 3;
double b;
}
struct s2
{
int i : 8;
int j : 4;
double b;
int a : 3;
}
printf("%d %d\n",sizeof(s1),sizeof(s2));
输出结果是:16,24;
理论上是这样的,首先是i在相对0的位置,占8位一个字节;然后j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里;然后是a,要在3位的倍数关系的位置上,因此要移1位,在15位的位置上放下,目前总共是18位,即2字节2位。由于double是8字节的,因此要在相对0是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了。因此总共是16个字节。
第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数。
使用位域的主要目的是压缩存储。
struct node
{
char onstatus; //1
char offstatus; //1
char allnums; //6
}
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将