特殊的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中其他成员无影响。
posted on 2012-03-05 17:44 William.Wu 阅读(650) 评论(0) 编辑 收藏 举报