关于位域的学习

来源:互联网 发布:上海java培训 编辑:程序博客网 时间:2024/05/16 23:35

以前从来没听说过”位域”这概念,今天在这学到了。

位域是C语言为了节省空间和使用方便而提供的一种新的数据结构,比如在生活中有很多只需要一位就可以表示不同状态的,操作系统中的位示图,就是用10表示空闲块和已分配的块。说白了就是一个字节可以分为多个域或段。

位域的定义和结构体相似:

struct 位域结构名{位域列表}

位域列表主要形式为  {类型说明符 位域名:位域长度 }

C99规定intunsigned intbool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是压缩存储,其大致规则为:
  1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
  2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
  3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
  4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
  5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

如:main()
{struct foo4
 {char    a : 2;
char    b : 3; int     c : 1; };
    printf("%d",sizeof(struct foo4));
}

由规则2知道,在VC6.0编译环境下,为位域a,b分配了一个字节,为位域c分配4个字节,又由5规则,所以运行结果为8