现在的位置: 首页 > 综合 > 正文

关于位域的一点总结

2013年08月09日 ⁄ 综合 ⁄ 共 708字 ⁄ 字号 评论关闭

位域(Bit-field),又叫位段(位字段),是一种特殊的结构成员或联合成员(也就是说,只能出现在结构体或联合体中),用来指定该成员在内存中所占的bit数。比如

struct st {
    unsigned a:5;
    unsigned b:4;
};

那么,位域究竟在哪里会被用到呢?

1. 不难设想这样一种情形。当使用位域时,可以节省大量内存空间,同时高效地实现相应功能。

2. 还有一种情形,就是,当程序要求必须访问字节的bit位时。

位域的数据类型:只能指定为unsigned、unsigned int、int三种类型之一。

当然,结构体或联合体的定义中可以同时出现位域成员和非位域成员。比如,

struct st {
    unsigned a:5;
    unsigned b:4;
    int i;
};

考虑一下,该结构体占用内存空间?由于,位域成员与非位域成员之间是字对齐的,因此

sizeof(struct st) = 8;

另外,还存在一种特殊的位域成员,即无名位域,其占用内存空间长度为0,它主要用于实现前后两个位域之间字对齐。比如说,下面这样一个结构体所占用内存空间为12字节。

struct st {
    unsigned a:5;
    unsigned :0;
    unsigned b:4;
    int i;
};


另外,还有一些使用位域时需要注意的地方:

1. 位域的长度不能大于int所占用的bit数。例如,如下位域说明是错误的:

unsigned int x:33;

2. 在内存中,带位域结构的各个位域的存储方式取决于具体的编译程序,因而使用位域的程序可移植性可能不大好,需要谨慎使用。

3. 不能对位域使用取地址运算符号&。


p.s. 一个很好的例子(《编程之美》1.2——中国象棋将帅问题) --更新于06/30/2012

抱歉!评论已关闭.