C语言中的一些关键字(十四)

来源:互联网 发布:linux物理内存分配 编辑:程序博客网 时间:2024/06/05 09:46

一、位段简介

有时,存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。
       1. 位段的概念与定义        所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。
例如,CPU的状态寄存器,按位段类型定义如下:
struct status
    { unsigned sign:         1;   /*符号标志*/
       unsigned zero:          1;   /*零标志*/
       unsigned carry:         1;   /*进位标志*/
       unsigned parity:        1;   /*奇偶/溢出标志*/
       unsigned half_carry: 1;   /*半进位标志*/
       unsigned negative:    1;   /*减标志*/
   } flags;


显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使用结构类型(需要6个字节)节省了5个字节。
2.说明
(1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。
(2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0~(2n-1)。
(3)使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。
例如,
struct status
    {  unsigned sign:        1;   /*符号标志*/
        unsigned zero:        1;   /*零标志*/
        unsigned carry:       1;   /*进位标志*/
        unsigned :                0;   /*长度为0的无名位段*/
        unsigned parity:       1;   /*奇偶/溢出标志*/
        unsigned half_carry: 1;   /*半进位标志*/
unsigned negative:    1;  /*减标志*/
     } flags;


原本6个标志位是连续存储在1个字节中的。由于加入了1个长度为0的无名位段,所以其后的3个位段,从下1个字节开始存储,一共占用2个字节。
(4)1个位段必须存储在1个存储单元(通常为1字节)中,不能跨2个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段。
(5)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。
(6)在数值表达式中引用位段时,系统自动将位段转换为整型数。


0 0
原创粉丝点击