位字段分析和总结.docxVIP

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
位字段 在存储空间很宝贵的情况下,有可能需要将多个对象保存在一个机器字中。一种常用的 方法是,使用类似于编译器符号表的单个二进制位标志集合。外部强加的数据格式(如硬件设备接口)也经常需要从字的部分值中读取数据。 考虑编译器中符号表操作的有关细节。程序中的每个标识符都有与之相关的特定信息, 例如,它是否为关键字,它是否是外部的且(或)是静态的,等等。对这些信息进行编码的最简洁的方法就是使用一个char或int对象中的位标志集合。 通常采用的方法是,定义一个与相关位的位置对应的“屏蔽码”集合,如: #define KEYWORD 01 #define EXTRENAL 02 #define STATIC 04 或 enum { KEYWORD = 01, EXTERNAL = 02, STATIC = 04 }; 这些数字必须是2 的幂。这样,访问这些位就变成了用第2 章中描述的移位运算、屏蔽运算及补码运算进行简单的位操作。 下列语句在程序中经常出现: flags |= EXTERNAL | STATIC; 该语句将flags中的EXTERNAL和STATIC位置为1,而下列语句: flags = ~(EXTERNAL | STATIC); 则将它们置为0。并且,当这两位都为0 时,下列表达式: if ((flags (EXTERNAL | STATIC)) == 0) ... 的值为真。 尽管这些方法很容易掌握,但是,C语言仍然提供了另一种可替代的方法,即直接定义和 访问一个字中的位字段的能力,而不需要通过按位逻辑运算符。位字段(bit-field),或简称字 段,是“字”中相邻位的集合。“字”(word)是单个的存储单元,它同具体的实现有关。例 如,上述符号表的多个#define语句可用下列3 个字段的定义来代替: struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned } flags; int is_static : 1; 这里定义了一个变量flags,它包含3 个一位的字段。冒号后的数字表示字段的宽度(用二进制位数表示)。字段被声明为unsigned int类型,以保证它们是无符号量。 单个字段的引用方式与其它结构成员相同,例如:flags.is_keyword、flags.is_extern 等等。字段的作用与小整数相似。同其它整数一样,字段可出现在算术 表达式中。因此,上面的例子可用更自然的方式表达为: flags.is_extern = flags.is_static = 1; 该语句将is_extern和is_static位置为1。下列语句: flags.is_extern = flags.is_static = 0; 将is_extern和is_static位置为0。下列语句: if (flags.is_extern == 0 flags.is_static == 0) ... 用于对is_extern和is_static位进行测试。 字段的所有属性几乎都同具体的实现有关。字段是否能覆盖字边界由具体的实现定义。 字段可以不命名,无名字段(只有一个冒号和宽度)起填充作用。特殊宽度0 可以用来强制在下一个字边界上对齐。 某些机器上字段的分配是从字的左端至右端进行的,而某些机器上则相反。这意味着, 尽管字段对维护内部定义的数据结构很有用,但在选择外部定义数据的情况下,必须仔细考虑哪端优先的问题。依赖于这些因素的程序是不可移植的。字段也可以仅仅声明为int,为了方便移植,需要显式声明该int类型是signed还是unsigned类型。字段不是数组,并 且没有地址,因此对它们不能使用运算符。

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地湖北
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档