位域: 关于位域的目的,用法,定义就不多说了,主要说一下位域的存储问题。
1.一个位域的大小可以超过一个字节,大小不要超过其声明的类型大小即可: 如:
int name:31;
2.如果相邻位域的类型相同,且其位宽之和小于等于类型的sizeof大小,则两位域放入一个字段存储:
如:
char name1 : 2;
char name2 : 6;
则这2个字段放入一个字节存储, sizeof结果为 1.
3.如果相邻位域的类型相同,且其位宽之和大于类型的sizeof大小,则第二个位段从下一个对齐开始存储:
如 :
char name1 : 5;
char name2 : 4;
则这2个字段放入两个字节存储,sizeof结果为 2.
4.如果相邻位域的类型不同,则这多个位段会存储在类型sizeof大的位段中,如果所有位段大小之和
小于等于最大类型的sizeof,则可以全部装下,否则,整个位域的存储空间会以最大类型的sizeof长度
来进行扩充 :
如 :
struct str{
char name1 :1;
int name2 :30;
char name3 :x;
};
当 x = 1时, sizeof(str) = 4;
当 x = 2时, sizeof(str) = 8;
5.如果你要使用位域,你应该很清楚每个字段的大小,从而有序的安排位域的顺序,最小化总字段空间:
如 :
struct str{ struct str{
char name1 : 4; char name1 : 4;
char name2 : 5; char name3 : 4;
char name3 : 4; char name2 : 5;
}; };
sizeof(str) = 3; sizeof(str) = 2;
关于空域: 站位域:
struct str{ struct str{
int name1 : 5; int name1 : 5;
int :0; int :2;
char name2 : 5; char name2 : 5;
}; };
sizeof(str) = 8; sizeof(str) = 4;
阅读(2408) | 评论(1) | 转发(0) |