关于位域的一点总结

位域(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










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值