字体
第(5/6)页
关灯
   存书签 书架管理 返回目录
 }

    12.2 位域(位段)

    有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例

    如在存放一个开关量时,只有 0 和 1 两种状态,用一位二进位即可。为了节省存储空间,并

    使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。

    所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。

    每个域有一个域名,允许在程序中按域名进行cāo作。这样就可以把几个不同的对象用一个字

    节的二进制位域来表示。

    1. 位域的定义和位域变量的说明

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

    struct 位域结构名

    { 位域列表 };

    其中位域列表的形式为:

    类型说明符 位域名:位域长度

    例如:

    struct bs

    {

    int a:8;

    int b:2;

    int c:6;

    };

    位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者

    直接说明这三种方式。

    例如:

    struct bs

    {

    int a:8;

    int b:2;

    int c:6;

    }data;

    说明 data 为 bs 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6

    位。

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

    1) 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存

    放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。

    例如:

    struct bs

    {

    unsigned a:4

    unsigned :0        /*空域*/

    unsigned b:4       /*从下一单元开始存放*/

    unsigned c:4

    }

    在这个位域定义中,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开

    始,占用 4 位,c 占用 4 位。

    2) 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说

    不能超过 8 位二进位。

    3) 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。

    例如:

    struct k

    {

    int a:1

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

    int b:3

    int c:2

    };

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

    2. 位域的使用

    位域的使用和结构成员的使用相同,其一般形式为:

    位域变量名?位域名

    位域允许用各种格式输出。

    【例 12.6】

    main(){

   
上一页 目录 下一页