爱悠闲 > 位域(bit fields)简介

位域(bit fields)简介

分类: C++与汇编  |  作者: zhangmiaoping23 相关  |  发布日期 : 2014-09-12  |  热度 : 130°

转:http://hi.baidu.com/taozpwater/item/398c214cd22a94e6a4c06645

1、简介

     位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

 

2、位域定义

    struct-declarator: 

    declarator 

    type-specifier declarator opt: constant-expression

    与结构定义相仿,其形式为:

  struct 位域结构名

  { 

    位域列表 

  };

  其中位域列表的形式为: 类型说明符 位域名:位域长度

  例如:

  struct bs

  {

    int a:8;

    int b:2;

    int c:6;

  };

 

3、位域的相关注意事项

  对于位域的定义尚有以下几点说明:

  1.位域的长度不能大于指定类型固有长度,比如说int的位域长度不能超过32,bool的位域长度不能超过8。

  2.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

  struct k

  {

    int a:1;

    int :2;/*该2位不能使用*/

    int b:3;

    int c:2;

  };

  从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

        3、位域不能用sizeof运算符进行计算。

 

4、位域的对齐

  如果结构体中含有位域(bit-field),那么VC中准则是:

  1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

  2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

  3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;

  系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行位域操作。

 struct mybitfields

{

    unsigned short a : 4;

    unsigned short b : 5;

    unsigned short c : 7;

} test;

 

int main( void );

{

    test.a = 2;

    test.b = 31;

    test.c = 0;

}

 

the bits would be arranged as follows:

00000001 11110010

cccccccb bbbbaaaa

 

Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.