Chinaunix首页 | 论坛 | 博客
  • 博客访问: 711782
  • 博文数量: 96
  • 博客积分: 2110
  • 博客等级: 大尉
  • 技术积分: 1018
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 19:36
文章分类

全部博文(96)

文章存档

2013年(2)

2012年(17)

2011年(77)

分类: C/C++

2011-02-08 16:25:42

2. 位段
TAG:位运算,位段
TEXT:
计算机在处理有符号数时,通过其最高位来标识当前数的正负。但是在逻辑表达式及其运算中,真与假是通过 一个16位整数来描述的,其中有15位的二进制数位的空间因没有用途而浪费。如何来充分利用计算机存储空间是软件工程中一个很重要的课题。例如,在计算机 网络通信中,TCP/IP协议中IP协议数据包头部的格式如表(12-2)所示。
            0                   15  16       31
            版本 首部长度 服务类型  数据包长度
            标示                    MP  碎片偏移
            生存时间      协议      首部校验和
            源IP地址
            目的IP地址
            选项

      表12-2: IP协议数据包头部格式

      如何来表达此类数据信息,在本节中介绍。
      在C语言中允许为结构体的每个成员分配特定的存储空间,这种以位为单位的成员称为位段。为了描述在本节开头介绍的IP协议数据结构,可以定义如下的结构 体。
      Struct IPData
      {
      unsigned Version:4,
      unsigned Headlength: 4,
      unsigned ServiceType: 8,
      unsigned Length: 16,
      usigned Tag: 16,
      ...
      }
      其中符号“:”后的整数常量表示此成员变量占用的位数。此结构体说明,Version占4位,因此表达的最大版本号位15;Length占16位,说明数 据包的最大长度为65535字节。
      其在内存中存储格式如下(表12-3):
            0                   15   16 31
            版本  首部长度 服务类型  数据包长度

      表12-3 IP协议数据包头部格式

      一般来讲,各个位段的长度没有限制,但是要注意位段的组织与存储方式。在使用位段的时候请注意如下问题:
      位段成员必须为整型数据,包括有符号数和无符号数;位段的长度为大于等于零的整数常量。
      位段长度为零的主要目的是使得下一成员从下一存储单元开始存放,本单元没有用完的单元空闲。
      可以定义匿名字段,此位段仅仅用于占位,而不是使用。其主要的目的是为了满足将来系统升级或扩充的需要。例如
      struct data
      {
      unsigned a:2
      unsigned b:2
      unsigned c:15
      }
      位段的长度不能够大于存储单元的长度,不能够定义位段数组。
      位段的引用,其实为位成员变量的引用,可以像使用整数变量一样使用,但是要注意存储空间的限制,即可存储数据的有效范围。

REF:.txt
阅读(1333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~