特殊的struct成员——位域

C语言提供了一种可以直接定义和访问一个字中某个位字段的方法,而不需要通过按位逻辑运算符,这就是位域或者位字段(bit-field)。它通过结构体实现,只要在普通成员后面加上一个冒号以及宽度(二进制)即可,所以位字段可以看做是结构体的一个特殊成员。例如:

 

1 struct {
2     int data;
3     unsigned bit1:1;
4     unsigned bit2:2;
5 }struct-with-bit-field;

 

结构体struct-with-bit-field中含有一个正常字段和两个位字段。bit1的宽度为1,占一位。bit2的宽度为2,占两位。

位域的几乎所有属性都同具体的实现有关,所以在使用中需要特别注意,在32位linux、gcc(gcc3.3.3)环境下需要注意以下问题:

位域的定义:

1. 字段可以不命名,无名字段(只有一个冒号和宽度)起填充作用。特殊宽度0可以用来强制在下一个子边界上分配字段空间。

2. 字段可以带类型也可以不带类型(不带类型默认为int类型,但是必须有一个signed修饰符),如果字段定义了类型那么字段的宽度不可以大于类型的宽度,比如char类型的位域字段宽度不可以大于8。不管怎样位域的字段宽度都不可以大于32(一个字的宽度)。

3. 一个位域必须放在一个字(32位——4字节)中,当一个字中剩余空间不足的时候,下一个字段会自动从一个新的字开始。

位域的空间:

1. 位域字段的类型不影响它所占用的空间。位域字段是按字(32位——4字节)对齐。比如一个char类型位域同样占用一个字。

2. 相邻的位域字段按照顺序使用空间,并按照字(32位——4字节)对齐。但是,要注意位域定义中的第三点:一个字中剩余字不满足的时候,它会从下一个字开始。

3. 如果位域字段不相邻,那么它们的空间将各自分配,并遵循上面两点。

位域的使用:

1. 位域字段不是数组,也和其他struct成员不同,他们不能使用&运算符取地址。

2. 给位域字段溢出赋值的话,它并不影响struct中其他成员或者其他位域字段,它会取溢出值的低位。比如:给一个宽度为2的字段赋值为一个int值,它只会去这个int值的低2位,并且struct中其他成员无影响。

 

转载于:https://www.cnblogs.com/chezxiaoqiang/archive/2012/03/05/2674391.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值