- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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类型。字段不是数组,并 且没有地址,因此对它们不能使用运算符。
您可能关注的文档
- 体育与健康导学案(2013下学期1).docx
- 体育与健康导学案(2013下学期2).docx
- 体育与健康实践课教案.docx
- 体育专业的社会实践报告(精选6篇).docx
- 体智能课程安排表.docx
- 听《卖火柴的小女孩》一课有感.docx
- 听公开课感悟体会参考.docx
- 听课调研汇报.docx
- 听课记录表分析和总结.docx
- 听课评课的注意事项.docx
- 年三年级数学下册第三四单元过关检测卷新人教版.docx
- 第十三章轴对称(复习课)1.ppt
- 15.1.2分式基本性质(2).ppt
- 期末冲刺(补全对话30道).docx
- 【华创证券-2025研报】2025年二季报公募基金十大重仓股持仓分析.pdf
- 【港交所-2025研报】景福集团 截至2025年3月31日止年度年报.pdf
- 【天风证券-2025研报】2025中报前瞻:关注预告日至财报日的景气超额.pdf
- 【国金证券-2025研报】连连数字(02598):跨境支付先行者,前瞻布局虚拟资产.pdf
- 【第一上海证券-2025研报】云工场(02512):云工(02512):IDC方案服务商,边缘云业务打造第二成长曲线.pdf
- 【东方证券-2025研报】主动权益基金2025年二季报全解析:重点关注科技医药双主线和中小盘高成长主题基金.pdf
文档评论(0)