结构体位域
时间:2010-03-29 来源:liuyuanyang
【: 数据位数】
组成的结构体:
struct xxx
{
成员1 类型成员1 : 成员1 位数;
成员2 类型成员2 : 成员2 位数;
成员3 类型成员3 : 成员3 位数;
};
基本的成员变量就会被拆分!这个语法在初级编程中很少用到,但在高级程序设计中不断地被用到!
例如:
struct student
{
unsigned int sex : 1;
unsigned int age : 15;
};
上述结构体中的两个成员sex 和age 加起来只占用了一个unsigned int 的空间(假设unsigned int 为16 位)。基本成员变量被拆分后,访问的方法仍然和访问没有拆分的情况是一样的,例如:
struct student sweek;
sweek.sex = MALE;
sweek.age = 20;
虽然拆分基本成员变量在语法上是得到支持的,但是并不等于我们想怎么分就怎么分,例如下面的拆分显然是不合理的:
struct student
{
unsigned int sex : 1;
unsigned int age : 12;
};
这是因为1+12 = 13,不能再组合成一个基本成员,不能组合成char、int 或任何类型,这显然是不能“自圆其说”的。在拆分基本成员变量的情况下,我们要特别注意数据的存放顺序,这还与CPU 是Big endian 还是Little endian来决定。Little endian 和Big endian 是CPU 存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
相关阅读 更多 +