说真的,什么是“位段”,想当初自己还真的不是很了解,因为压根就用不着,更何况如今FLASH都是上512KB的容量,估计很少很少有人用到,但有时候还是非常有用的。
关键优势: 在一些经济型产品设计中,多一点浪费,少一点又不能完成项目需求,所以“能省就省,花最少的钱办最多的事”。采用位段结构既能够节省空间,而且又方便于操作。
位段定义: C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) ,这样利用位段能够用较少的位数存储数据。
应用举例:
例如在有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。比如我们经常会有开关量的使用,而它只有0和1两种状态,用一位二进位即可。我们正常直接一个字符型搞定,但如果用位段,我们一个字符却能够存8个开关量,总大小只有一个字节,而如果用字符型就要8个字节,这种优势十分明显啊。
如何定义: --------------------------------------------------
struct 位域结构名 { 位域列表 };
其中位域列表的形式为: 类型说明符位域名:位域长度 -------------------------------------------------- -------------------------------------------------- 例如: struct packed-data
{
unsigned a:2;
unsigned b:6;
unsigned c:4;
unsigned d:4;
int i;
}data; --------------------------------------------------
存放方式:
a是字符型,占两位,说明data为packed-data变量,共占两个字节。其中位段a占2位,位域b占6位,位域c和d占4位。
终上所述,位段在本质上就是一种结构类型,其成员是按二进位分配的。
使用须知:
1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型;
2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位;
3)无名位段不能被访问,但是会占据空间;
4)不能对位段进行取地址操作;
5)若位段占的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元(这里的位段存储单元经测试在VC环境下是4个字节)开始存放;
6)若位段出现在表达式中,则会自动进行整型升级,自动转换为int型或者unsigned int。
7)对位段赋值时,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。
8)位段不能出现数组的形式。
|