2027年 计算机组成原理考研复习指导 王道论坛 组编 购买王道书,就上 王道官方考研书店 wangdao.taobao.com 電子工業出版社 Publishing House of Electronics Industry 北京·BEIJING 官方开源,高清带书签PDF 最新配套视频请上bilibili.com 搜索“王道” 内容简介 本书是计算机专业硕士研究生入学考试“计算机组成原理”课程的复习用书,内容包括计算机系统概述、数据的表示和运算、存储系统、指令系统、中央处理器、总线、输入/输出系统等。全书严格按照最新计算机考研大纲计算机组成原理部分的要求,集中梳理了大纲所涉及的知识点,力求内容精练、重点突出、深入浅出。本书精选多所名校的历年考研真题,给出详细的解题思路,力求实现讲练结合、灵活掌握、举一反三的功效。 本书可作为考生参加计算机专业硕士研究生入学考试的复习用书,也可作为计算机专业学生学习“计算机组成原理”课程的辅导用书。 未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。 版权所有,侵权必究。 图书在版编目(CIP)数据 2027年计算机组成原理考研复习指导/王道论坛组 编.--北京:电子工业出版社,2026.1.--ISBN 978-7-121-51794-5 Ⅰ. TP301 中国国家版本馆CIP数据核字第2026H59L24号 责任编辑:谭海平 印刷: 装订: 出版发行:电子工业出版社 北京市海淀区万寿路173信箱 邮编:100036 开本:787×1092 1/16 印张:21.25 字数:598.4千字 版次:2026年1月第1版 印次:2026年1月第1次印刷 定价:71.00元 凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。 质量投诉请发邮件至zltm@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。 本书咨询联系方式:(010)88254552,tan02@phei.com.cn。 官方开源,高清带书签PDF 最新配套视频请上bilibili.com搜索“王道” 1 B站搜索“王道计算机教育” 本书配套资源介绍 2 扫码关注“王道在线” 进入菜单“兑换中心” 兑换配套课件等资源 王道计算机考研题库3 开通题库小程序 VIP权限 【关于配套视频的说明】 1.配套的考点精讲视频与习题视频均为最新版本,已免费发布在B站,无须兑换,内容持续更新,可放心使用! 2.【王道计算机刷题库】小程序面向所有读者免费开放,它将纸质习题数字化,可智能刷题,靶向提分,高效备考! 3.兑换码用于获取课件资源,以及开通小程序VIP权限。 4.兑换码位于封面右下角,区分大小写,不含空格,且一经兑换即失效。 盗版书无兑换码请勿购买 配套视频不包含答疑服务 官方开源,高清带书签PDF 最新配套视频请上bilibili.com搜索“王道” 前 言 “王道考研系列”的定位是考试类辅导书。本书主要分为考点讲解部分和习题讲解部分,前者的篇幅约占35%,后者的篇幅约占65%。考点讲解部分按照统考大纲梳理考点,主要参考了一些权威教材,如唐朔飞老师的《计算机组成原理》、袁春风老师的《计算机系统基础》等,并且融合了作者的总结与理解,在此对这些老师表示致敬和感谢!习题讲解部分主要精选自多所名校的自命题考研真题、教材配套习题册、同类辅导书,或者改编自统考真题。 由于篇幅限制,考点讲解部分较为精炼,对学科基础较为薄弱的读者来说,可能难以理解。为此,我们提供了配套的考点精讲视频和习题讲解视频。考点精讲视频有形象丰富的动画演示、由浅入深的考点分析,相信能打通读者复习过程中的“任督二脉”。往年有不少读者反馈视频和王道书不太匹配,这是因为王道书的出版时间远早于课程制作时间,而咸鱼老师录制课程时会参考众多的优秀教材(不限于王道书);后面,我们将逐步解决这个问题。此外,早期的习题讲解视频主要由高分学长录制,因为质量参差不齐,现已全部下架。目前,仅提供由王道老师重新录制的最新版本,该版本已覆盖全部选择题;综合题的重新录制工作会适时启动并及时发布。 考点精讲视频和习题讲解视频免费发布在B站账号“王道计算机教育”上。 “王道考研系列”是计算机考研学子口碑相传的辅导书,自2011版首次推出以来,就始终占据同类书销量的榜首位置,这就是口碑的力量。有这么多学长的成功经验,相信读者只要合理地利用本套书,并采用科学的复习方法,就一定能收获属于自己的那份回报。 针对考研学子的需求,我们还开发了除本书配套视频外的一系列计算机考研课程,包括C语言督学课、408基础课、408暑期强化课、408冲刺课、机试课、模拟面试、调剂,以及复习规划、伴学督学、一对一指导、全程实时答疑和择校服务等。王道的课程同样是市面上领先的计算机考研课程,对学科基础较为薄弱的读者来说,相信这些课程和服务定能助你一臂之力。 “不包就业、不包推荐,培养有态度的码农。”王道训练营是王道团队打造的线下魔鬼式编程训练营。打好编程功底,增强项目经验,彻底转行入行,不再迷茫,期待有梦想的你! 参与本书编写的人员主要有赵霖、罗乐、徐秀瑛、赵淑芬、范佳玉、严汉、喻云珍、余勇、赵淑芳、刘政学、罗庆学、赵晓宇等。予人玫瑰,手有余香,王道论坛伴你一路同行! 对本书的任何建议,或发现有错误,欢迎扫码与我们联系,以便及时优化或纠错。 风华漫舞 官方开源,高清带书签PDF 最新配套视频请上bilibili.com搜索“王道” 致 读 者——关于王道单科辅导书使用方法的道友建议 我是“二战考生”,2012 年第一次考研成绩为333分(专业代码408,成绩为81分),痛定思痛后决心再战。潜心复习了半年后终于以392分(专业代码408,成绩为124分)考入上海交通大学计算机科学与技术专业,这半年里我的专业课成绩提高了43分,成了提分主力。从未达到录取线到考出比较满意的成绩,从蒙头乱撞到有了自己明确的复习思路,我想这也是风华哥从诸多高分选手中选择我给大家介绍经验的一个原因吧。 整个专业课的复习是围绕王道辅导书展开的,从一遍、两遍、三遍看单科辅导书的积累提升,到做8套模拟题时的强化巩固,再到看思路分析时的醍醐灌顶。王道辅导书能两次押中算法原题固然有运气成分,但这也从侧面说明编者的编写思路和选题方向与真题很接近。 下面说一说我的具体复习过程。 每天划给专业课的时间是 3~4小时。第一遍仔细看课本,看完一章做一章单科辅导书上的习题(红笔标注错题),这一遍共持续2个月。第二遍主攻单科辅导书(红笔标注重难点),辅看课本。第二遍看单科辅导书和课本的速度快了很多,但感觉收获更多,常有温故知新的感觉,理解更深刻。(风华注:建议这里再速看第三遍,特别针对错题和重难点。模拟题做完后再跳看第四遍。) 以上是打基础阶段,注意:我仔细精读了两遍单科辅导书和课本,以便尽量弄懂每个知识点和习题。大概 11 月上旬开始做模拟题和思路分析,其间遇到不熟悉的地方不断回头查阅单科辅导书和课本。8套模拟题的考点覆盖得很全面,所以大家做题时如果忘记了某个知识点,千万不要慌张,赶紧回去看这个知识点,最后的模拟就是查漏补缺。模拟题一定要严格按考试时间(3小时)去做,注意应试技巧,做完试题后再回头研究错题。算法题的最优解法不太好想,如果实在没思路,建议直接“暴力”解决,结果正确也能有10分,总比苦拼出15分来而将后面比较好拿分的题耽误了好(这是我第一次考研的切身教训)。最后剩了几天看标注的错题,第三遍跳看单科辅导书,考前一夜浏览完网络,踏实地睡着了······ 考完专业课,走出考场终于长舒一口气,考试情况也心中有数。回想这半年的复习,耐住了寂寞和诱惑,雨雪风霜从未间断地跑去自习,考研这人生一站终归没有辜负我的良苦用心。佛教徒说世间万物生来平等,都要落入春华秋实的代谢中去;辩证唯物主义认为事物作为过程存在,凡是存在的终归要结束。你不去为活得多姿多彩而拼搏,真到了和青春说再见时,你是否会可惜虚度了青春?风华哥说过,我们都是有梦想的青年,我们正在逆袭,你呢? 感谢风华哥的信任,给我这个机会为大家分享专业课复习经验,作为一个铁杆道友在王道受益匪浅,也借此机会回报王道论坛。祝大家金榜题名! ccg1990@SJTU 王道训练营 王道是道友考研路上值得信赖的伙伴。十多年来,我们陪伴了数百万计算机考研学子,从考研图书,到辅导课程、编程训练,始终助力大家提升真实能力。 我们都清楚,计算机是个靠实力说话的专业。王道团队中的许多人,也曾和你一样:本科迷茫、基础薄弱,把考研当作改变命运的出路。但后来明白学历只是入场券。同样是名校硕士,有人早就拿下了心仪的 Offer,也有人毕业即失业,再次陷入焦虑。 如今,虽然 AI 让编写代码变得简单了,但却抬高了能力门槛:会写语法已远远不够,系统设计与工程落地才是核心竞争力。如果你只会调 API,但无法思考架构、解决实际问题,那么读研可能只是把竞争往后推迟了几年。我们真心希望,王道能帮你少走弯路。我们教的不只是“怎么用 AI”,更有“怎么用好 AI”——成为能主导项目、把控技术方向的人。 考研结束后的空档期,是你补编程、练实战的黄金窗口。趁生活尚未被新任务填满,抓紧补齐本科阶段落下的核心能力,别等到入学或入职才惊觉差距。参加王道训练营,说到底,就是对自己的一次认真投资,而投资自己永远最值得。 王道训练营简介 1. 面向就业 适合希望转行但编程基础薄弱的你。 考研不是人生的唯一出路。无论结果如何,这段拼搏都值得铭记,但不必让它成为遗憾的终点。不少在考研路上暂时受挫的道友,在王道找到了技术成长的新起点。我们始终相信:肯努力、肯坚持的人,终会走出属于自己的路。 在高度竞争的技术领域,你当下的编程能力决定了你能拿到什么 Offer;而你的学习态度与潜力,才决定你能走多远。再不行动,机会只会悄然溜走。 王道训练营,为有梦想、敢奋斗的你铺就通往高质量就业的坚实通道。 2. 面向硕士 适合刚上岸的准硕士,希望赢在研一起跑线。 考上研究生是重要转折,但硕士学历早已不是“保险箱”。考研高分不等于高薪 Offer,同是名校硕士,有人手握字节跳动、腾讯等大厂的 Offer,有人却“屡面屡败”——差距,往往在入学前就已拉开。 王道训练营相当于“硕士先修班”:开学前啃下企业级代码,带着完整项目进组。当同门还在熟悉环境,你已用“大模型+微服务”跑通实验室课题;导师自然更愿意把核心项目、论文一作等机会优先给你。抓住这个隐形的转折点,三年后你的简历上不止有学历,更有扎实的工程能力、可落地的项目和发表的文章——高薪 Offer,水到渠成。 3. 报名要求 ·具有本科学历,愿以“高三式”的专注全力投入。 ·须认真完成开课前的作业——不看基础,只看态度,合格方可入营,宁缺毋滥。 作业是最重要的筛选标准。我们从不看轻跨专业或双非背景的你——坚定转行者往往更 官方开源,高清带书签PDF 最新配套视频请上bilibili.com搜索“王道” 王道训练营 VII 拼、更踏实。学校和专业是过去的标签,能力靠持续努力重塑。一段高强度训练,完全可能让你逆袭,这已被无数的往期学员用结果证明。 4. 学习成效 我们以“动手编程+实战项目”为核心,帮你补齐当下的能力短板,指明后续的学习方向。你收获的不只是方法,更是工程师的思维方式——真正推开职场大门。 自 2020 年起,王道坚持公开每期真实就业数据,承诺 100%真实!学员从零起步,成长为能解决问题的开发者。部分学员成功入职字节跳动、腾讯、阿里、拼多多、京东、华为、百度、小米等互联网大厂;也有不少学员进入东方财富交易组、大疆飞控、比亚迪车规芯片、深信服防火墙引擎、招商银行风控等部门,岗位覆盖后端、算法、嵌入式、金融量化、信息安全等方向。我们不信“神秘高薪”,只信真实结果。 王道训练营优势 这里聚集的都是道友——彼此信任,乐于分享,氛围纯粹而温暖。经历过考研的你,深知转行路上的孤独与压力,因此更容易成为并肩作战的战友:互相答疑、一起 debug、共同成长。在技术转型的路上,这样的圈子是最宝贵的资源。正如一位学员所说:“来了你就发现,这里无关学历、背景或过往,只关乎一件事——对自己认真,对自己负责。” 我们的授课老师平均拥有8年以上的开发与教学经验,编程功底扎实,教学经验丰富。上课时,授课老师不会照本宣科地念 PPT,而会展示真正上线运行过的代码,分享实际工作中遇到的“坑”、提升系统性能的方法,以及处理突发线上问题的经验。用真实的实战经验引导大家,以严谨的技术态度陪伴每位学员——既是对道友信任的回应,又是我们坚守的责任。 王道训练营课程 王道训练营目前开设5种班型: ·复试冲刺/春招 (Python/Linux C/Java/C++) 项目班(40~45天,初试结束后开班) ·AI应用开发(Java)方向(四个半月,武汉校区,掌握AI应用开发,抢占技术高地) ·微服务开发C++方向(四个半月,武汉校区,深入后端架构,进入核心开发岗) ·嵌入式开发C++方向(四个半月,武汉校区,紧跟硬科技趋势,切入芯片/物联网) ·Python大模型方向(三个半月,直播授课或深圳校区,紧跟前沿算法,AI算法工程师)项目班的作用是利用初试后的时间和寒假期间,快速提升编程能力和项目经验,为复试和春招面试加分。其余4种班型既适合想就业的你,又适合已上岸想提升能力或计划继续考研的你。 想了解课程、获取就业数据或就业咨询吗?扫码添加王道老师的微信,一对一为你解答。 官方开源,高清带书签PDF 最新配套视频请上bilibili.com搜索“王道” 目 录 第1章 计算机系统概述·································································1 *1.1 计算机发展历程^{\enclose{circle}{1}}····························································1 1.1.1 计算机硬件的发展········································································1 1.1.2 计算机软件的发展········································································2 1.2 计算机系统层次结构········································································2 1.2.1 计算机系统的组成········································································2 1.2.2 计算机硬件········································································2 1.2.3 计算机软件········································································2 1.2.4 计算机系统的层次结构····································································4 1.2.5 计算机系统的不同用户····································································6 1.2.6 计算机系统的工作原理····································································7 1.2.7 本节习题精选········································································8 1.2.8 答案与解析········································································9 1.3 计算机的性能指标········································································11 1.3.1 计算机的主要性能指标···································································11 1.3.2 本节习题精选········································································13 1.3.3 答案与解析········································································15 1.4 本章小结············································································18 1.5 常见问题和易混淆知识点····································································18 第2章 数据的表示和运算········································································20 2.1 数制与编码····················································································20 2.1.1 进位计数制及其相互转换··································································20 2.1.2 定点数的编码表示········································································22 2.1.3 整数的表示············································································25 2.1.4 C语言中的整数类型及类型转换························································25 2.1.5 本节习题精选········································································27 2.1.6 答案与解析········································································29 2.2 运算方法和运算电路········································································32 2.2.1 基本运算部件········································································32 2.2.2 定点数的移位运算········································································35 2.2.3 定点数的加减运算········································································35 2.2.4 定点数的乘除运算········································································39 2.2.5 本节习题精选········································································44 2.2.6 答案与解析········································································48 ① 加“*”的章节表示已从最新统考大纲中删除,仅供学习参考。 打印店 目 录 IX 2.3 浮点数的表示与运算⋯53 2.3.1 IEEE 754标准的浮点数⋯54 2.3.2 浮点数的加减运算⋯56 2.3.3 C语言中的浮点数类型⋯58 2.3.4 数据的宽度和存储⋯59 2.3.5 本节习题精选⋯61 2.3.6 答案与解析⋯66 2.4 本章小结⋯75 2.5 常见问题和易混淆知识点⋯75 第3章 存储系统⋯77 3.1 存储器概述⋯77 3.1.1 存储器的分类⋯77 3.1.2 主存储器的组成和基本操作⋯78 3.1.3 存储器的层次化结构⋯79 3.1.4 存储器的主要性能指标⋯79 3.1.5 本节习题精选⋯80 3.1.6 答案与解析⋯81 3.2 主存储器⋯82 3.2.1 半导体随机存取存储器⋯82 3.2.2 非易失性存储器⋯85 3.2.3 多模块存储器⋯85 3.2.4 本节习题精选⋯87 3.2.5 答案与解析⋯92 3.3 主存储器与CPU的连接⋯97 3.3.1 连接原理⋯97 3.3.2 主存容量的扩展⋯97 3.3.3 本节习题精选⋯99 3.3.4 答案与解析⋯100 3.4 外部存储器⋯102 3.4.1 磁盘存储器⋯102 3.4.2 固态硬盘⋯104 3.4.3 本节习题精选⋯105 3.4.4 答案与解析⋯107 3.5 高速缓冲存储器⋯109 3.5.1 程序访问的局部性原理⋯109 3.5.2 Cache的基本工作原理⋯110 3.5.3 Cache和主存的映射方式⋯111 3.5.4 Cache中主存块的替换算法⋯114 3.5.5 Cache的一致性问题⋯115 3.5.6 Cache容量的计算举例⋯115 3.5.7 Cache的应用⋯116 3.5.8 本节习题精选⋯117 官方开源,高清带书签PDF 最新配套视频请上bilibili.com 搜索“王道” × 2027年计算机组成原理考研复习指导 3.5.9 答案与解析⋯122 3.6 虚拟存储器⋯130 3.6.1 虚拟存储器的基本概念⋯130 3.6.2 页式虚拟存储器⋯130 3.6.3 段式虚拟存储器⋯134 3.6.4 段页式虚拟存储器⋯134 3.6.5 虚拟存储器与 Cache 的比较⋯134 3.6.6 本节习题精选⋯135 3.6.7 答案与解析⋯141 3.7 本章小结⋯146 3.8 常见问题和易混淆知识点⋯147 第 4 章 指令系统⋯148 4.1 指令系统⋯148 4.1.1 指令集体系结构⋯148 4.1.2 指令的基本格式⋯149 4.1.3 定长操作码指令格式⋯150 4.1.4 扩展操作码指令格式⋯150 4.1.5 指令的类型⋯151 4.1.6 本节习题精选⋯151 4.1.7 答案与解析⋯153 4.2 寻址方式⋯156 4.2.1 指令寻址和数据寻址⋯156 4.2.2 常见的数据寻址方式⋯157 4.2.3 本节习题精选⋯160 4.2.4 答案与解析⋯166 4.3 程序的机器级代码表示⋯171 4.3.1 常用汇编指令介绍⋯172 4.3.2 选择语句的机器级表示⋯176 4.3.3 循环语句的机器级表示⋯177 4.3.4 过程调用的机器级表示⋯179 4.3.5 本节习题精选⋯181 4.3.6 答案与解析⋯187 4.4 CISC 和 RISC 的基本概念⋯190 4.4.1 复杂指令系统计算机 (CISC) ⋯191 4.4.2 精简指令系统计算机 (RISC) ⋯191 4.4.3 CISC 和 RISC 的比较⋯191 4.4.4 本节习题精选⋯192 4.4.5 答案与解析⋯193 4.5 本章小结⋯193 4.6 常见问题和易混淆知识点⋯194 第 5 章 中央处理器⋯195 5.1 CPU 的功能和基本结构⋯195 官方开源,高清带书签PDF 最新配套视频请上bilibili.com搜索“王道” 目 录 XI 5.1.1 CPU的功能 ⋯195 5.1.2 CPU的基本结构 ⋯196 5.1.3 CPU中的寄存器 ⋯197 5.1.4 本节习题精选 ⋯197 5.1.5 答案与解析 ⋯199 5.2 指令执行过程 ⋯201 5.2.1 指令执行的一般流程 ⋯201 5.2.2 CPU的时序控制 ⋯202 5.2.3 指令周期的基本概念 ⋯202 5.2.4 处理器指令执行模型 ⋯203 5.2.5 本节习题精选 ⋯204 5.2.6 答案与解析 ⋯205 5.3 数据通路的功能和基本结构 ⋯206 5.3.1 数据通路的功能 ⋯206 5.3.2 数据通路的组成 ⋯206 5.3.3 数据通路的组织与分类 ⋯207 5.3.4 单总线结构的数据通路 ⋯208 5.3.4 专用结构的数据通路 ⋯210 5.3.5 本节习题精选 ⋯213 5.3.6 答案与解析 ⋯221 5.4 控制器的功能和工作原理 ⋯228 5.4.1 控制器的结构和功能 ⋯228 5.4.2 硬布线控制器 ⋯229 5.4.3 微程序控制器 ⋯229 5.4.4 本节习题精选 ⋯234 5.4.5 答案与解析 ⋯238 5.5 异常和中断机制 ⋯242 5.5.1 异常和中断的基本概念 ⋯242 5.5.2 异常和中断的分类 ⋯242 5.5.3 异常和中断响应过程 ⋯243 5.5.4 本节习题精选 ⋯244 5.5.5 答案与解析 ⋯245 5.6 指令流水线 ⋯247 5.6.1 指令流水线的基本概念 ⋯247 5.6.2 流水线的基本实现 ⋯248 5.6.3 MIPS指令集的流水段分析 ⋯249 5.6.4 流水线的冒险与处理 ⋯251 5.6.5 高级流水线技术 ⋯254 5.6.6 本节习题精选 ⋯255 5.6.7 答案与解析 ⋯260 5.7 多处理器的基本概念 ⋯267 5.7.1 SISD、SIMD、MIMD的基本概念 ⋯267 5.7.2 硬件多线程的基本概念 ⋯268 官方开源,高清带书签PDF 最新配套视频请上bilibili.com 搜索“王道” XII 2027年计算机组成原理考研复习指导 5.7.3 多核处理器的基本概念 269 5.7.4 共享内存多处理器的基本概念 269 5.7.5 本节习题精选 270 5.7.6 答案与解析 271 5.8 本章小结 272 5.9 常见问题和易混淆知识点 273 第6章 总线 274 6.1 总线概述 274 6.1.1 总线的分类 274 *6.1.2 常见的总线标准 275 6.1.3 总线的性能指标 276 6.1.4 总线的结构 276 6.1.5 本节习题精选 278 6.1.6 答案与解析 280 6.2 总线事务和定时 283 6.2.1 总线事务 283 6.2.2 总线定时 284 6.2.3 本节习题精选 286 6.2.4 答案与解析 288 6.3 本章小结 290 6.4 常见问题和易混淆知识点 290 第7章 输入/输出系统 291 *7.1 I/O系统基本概念 291 *7.1.1 输入/输出系统 291 *7.1.2 外部设备 292 *7.1.3 本节习题精选 293 *7.1.4 答案与解析 293 7.2 I/O接口 293 7.2.1 I/O接口的功能 294 7.2.2 I/O接口的基本结构 294 7.2.3 I/O接口的类型 295 7.2.4 I/O端口及其编址 295 7.2.5 本节习题精选 295 7.2.6 答案与解析 297 7.3 I/O方式 299 7.3.1 程序查询方式 299 7.3.2 程序中断方式 300 7.3.3 DMA方式 305 7.3.4 本节习题精选 309 7.3.5 答案与解析 317 7.4 本章小结 326 7.5 常见问题和易混淆知识点 326 参考文献 328 第1章 计算机系统概述 【考纲内容】 (一)计算机系统层次结构 计算机系统的基本组成 计算机硬件的基本组成 计算机软件和硬件的关系 计算机系统的工作原理:“存储程序”的方式;高级语言程序与机器语言程序的转换;程序和指令的执行过程 (二)计算机性能指标 吞吐量;响应时间;CPU时钟周期;主频;CPI;CPU执行时间; MIPS; MFLOPS; GFLOPS; TFLOPS; PFLOPS; EFLOPS; ZFLOPS 【复习提示】 本章作为计算机组成原理的概述,旨在建立对计算机系统整体结构与核心概念的初步认识。其中涉及的基本原理与性能指标,是理解后续章节的基础。初学时若对某些概念理解尚浅,无须过度担忧;随着课程的深入,这些知识将在具体上下文中逐渐明晰。 在学习本章时,建议读者思考以下问题: 1)主频高的CPU一定比主频低的CPU性能更高吗?为什么? 2)翻译程序、汇编程序、编译程序与解释程序有何区别?各自的特征是什么? 3)不同级别的编程语言所编写的程序有何差异?哪一类语言可被硬件直接执行? 建议读者在学习过程中尝试回答这些问题,本章末尾将提供参考答案。 1.1计算机发展历程 1.1.1计算机硬件的发展 1.计算机的四代变化 从1946年世界上第一台电子数字计算机(Electronic Numerical Integrator And Computer, ENIAC)问世以来,计算机的发展已经历了四代。 1)第一代计算机(1946—1957年)——电子管时代。特点:逻辑元件采用电子管;使用机器语言编程;主存储器采用延迟线或磁鼓,容量极小;体积庞大,成本高昂;运算速度较低,一般仅为每秒几千次至几万次。 ①加“*”章节表示非统考大纲要求内容或已从统考大纲中删除的内容,仅供学习参考。 2 2027年计算机组成原理考研复习指导 2) 第二代计算机 (1958—1964年) ——晶体管时代。特点:逻辑元件采用晶体管;运算速度提升至每秒几万次至几十万次;主存储器使用磁芯存储器;计算机软件开始发展,出现了高级语言及其编译程序,并形成了操作系统的雏形。 3) 第三代计算机 (1965—1971年) ——中小规模集成电路时代。特点:逻辑元件采用中小规模集成电路;半导体存储器逐步取代磁芯存储器;高级语言迅速普及,操作系统进一步成熟,出现了分时操作系统。 4) 第四代计算机 (1972年至今) ——超大规模集成电路时代。特点:逻辑元件采用大规模和超大规模集成电路,微处理器由此诞生;并行处理、流水线、高速缓存和虚拟存储器等关键技术被广泛应用于该代计算机。 2. 计算机元件的更新换代 1) 摩尔定律。在价格不变的前提下,集成电路上可容纳的晶体管数量约每18个月翻一番,从而推动性能显著提升。这意味着,18个月后以相同价格购买的处理器,其理论性能潜力约为当前产品的两倍。这一定律深刻揭示了信息技术的快速发展节奏。 2) 半导体存储器的发展。1970年,美国仙童半导体公司研制出首个较大容量的半导体存储器。此后,单芯片存储容量从1KB、4KB、16KB、64KB、256KB,逐步发展到1MB、4MB、16MB、64MB、256MB、1GB, 并已进入TB级别。 3) 微处理器的发展。自1971年Intel公司推出首款微处理器Intel 4004以来,微处理器不断演进,包括Intel 8008(8位)、Intel 8086(16位)、Pentium(32位)、Core i7(64位)等。其中,32位、64位指的是机器字长(简称字长),即CPU通用寄存器的宽度,它决定了单次整数运算可以处理的数据位数以及可直接寻址的内存空间大小。 1.1.2 计算机软件的发展 计算机软件技术的蓬勃发展,为计算机系统的发展做出了重要贡献。 计算机语言的演进经历了面向机器的机器语言和汇编语言,逐步发展到更接近人类表达方式的高级语言。高级语言极大地推动了软件产业的进步,其中包括用于科学与工程计算的FORTRAN,支持结构化程序设计的Pascal,面向对象的C++,以及具有跨平台特性的Java等。 与此同时,各类系统软件也取得了长足进展,对计算机系统的功能完善与高效运行起到了关键作用,其中尤以操作系统为代表,如Windows、UNIX、Linux等。 1.2 计算机系统层次结构 1.2.1 计算机系统的组成 一个完整的计算机系统由硬件与软件组成。硬件指有形的物理装置,即计算机系统中的各类物理部件;软件则是在硬件上运行的程序及其相关的数据与文档。 计算机系统的实际性能,在很大程度上取决于软件对硬件资源的利用效率,而该效率的实现依赖于硬件所提供的能力。因此,计算机系统设计必须合理划分软硬件的功能边界。一般而言,对于使用频繁且硬件实现成本较低的功能,宜由硬件实现,以显著提升整体效率。 第1章 计算机系统概述 3 1.2.2 计算机硬件 1.冯·诺依曼机的基本思想 考点追踪 冯·诺依曼机的特点 (2019) 冯·诺依曼在研究EDVAC 机时首次提出了“存储程序”的思想,奠定了现代计算机的基本结构。基于这一思想的计算机统称为冯·诺依曼机,其主要特点如下: 1)采用“存储程序”的工作方式:将编制好的程序和初始数据预先存入主存储器,计算机启动后能自动、连续地取指并执行,直至程序结束,无须人工干预。 2)硬件系统由运算器、控制器、存储器、输入设备和输出设备五大部件组成。 3)指令和数据在存储器中以相同形式存放,仅凭内容无法区分,但计算机应能识别它们。 4)指令和数据均采用二进制编码表示。 5)指令由操作码和地址码组成,其中操作码指明操作类型,地址码指出操作数的地址。 2.计算机的功能部件 现代计算机将运算器、控制器和各类寄存器高度集成,形成一块称为中央处理器 (Central Processing Unit,CPU)的芯片。完整的计算机硬件系统主要包含以下部件:中央处理器、存储器、输入/输出控制器、外部设备,以及用于协调这些部件协同工作的总线。 (1) 中央处理器 中央处理器(CPU)是计算机系统中负责指令执行的核心部件。其传统基本组成部分为运算器和控制器;在现代处理器架构中,这两部分被系统地组织为数据通路与控制单元。 数据通路是执行实际运算的硬件通路,其核心包括算术逻辑单元(ALU)和通用寄存器组。ALU 负责完成所有算术与逻辑运算;通用寄存器组则为 ALU 提供操作数并暂存运算结果,是实现高速数据访问的关键。此外,数据通路还包含多路选择器、内部互连通路等组件,用于在各个部件间高效传送数据。控制单元负责协调整个 CPU 的工作。它从存储器中取出指令并译码,随后根据指令语义生成一系列精确的控制信号,指挥数据通路中的各部件(例如,选择源寄存器、配置ALU 功能、启动运算并在正确时序下完成结果写回),从而确保指令有序、高效地执行。 (2) 存储器 按访问特性,存储器通常分为内存与外存。现代内存由主存和高速缓存(Cache)组成;但由于 Cache是后期引入的,传统上“内存”仅指主存。在冯·诺依曼结构中,主存作为核心的工作存储器,用于存放待执行的程序和数据。外存则包括两类:一是可与主存交换数据的磁盘、固态硬盘等,二是用于长期备份的海量存储设备(如磁带、光盘等)。 (3)外部设备和设备控制器 外部设备简称外设,也称I/O 设备(I/O 是 Input/ Output 的缩写)。外设通常由物理功能部件(如打印头、鼠标滚轮或按键等)和设备控制器组成,二者在功能或物理实现上往往相互分离;前者负责实际的输入/输出操作,后者则负责与主机通信并控制前者的工作。 外设通过设备控制器连接到主机上,各种设备控制器统称I/O 控制器或I/O接口。例如,键盘接口、显示控制器(简称显卡)、网络控制器(简称网卡)等都是设备控制器。 (4) 总线 总线是计算机中用于在各个部件之间传输信息的公共通路。CPU、主存和I/O接口通过总线互连;其中,CPU 和I/O 接口内部均包含寄存器,部分还集成了高速缓存。 图1.1展示了一个典型的多总线计算机硬件系统。CPU 作为核心,内含控制器、ALU、寄存 4 2027年计算机组成原理考研复习指导 器堆和总线接口部件。CPU通过处理器总线,并经由I/O桥接器与主存和I/O设备通信;主存通过存储器总线,并经由I/O桥接器与CPU和I/O设备相连;各类I/O设备则通过其控制器(如USB控制器、显示适配器)接入I/O总线。按功能划分,ALU属于数据处理部件,负责对寄存器中的数据进行运算;主存和磁盘属于存储部件,分别承担临时存储与长期存储任务;而所有总线、桥接器、接口及控制器共同构成系统的互连结构,负责全系统的数据传输与协调。 CPU 寄存器堆 控制器 ALU 处理器总线 存储器总线 总线接口部件 北桥芯片 I/O桥接器 主存储器 I/O总线 USB控制器 显卡适配器 磁盘控制器 鼠标 键盘 显示器 磁盘 图1.1一个典型的多总线计算机硬件系统 1.2.3 计算机软件 1.系统软件和应用软件 软件按其功能可分为系统软件和应用软件。 系统软件是一组保障计算机系统高效、正确运行的基础软件,用于管理和调度系统资源,为用户及应用程序提供基础服务。典型的系统软件包括:操作系统(OS)、数据库管理系统(DBMS)、语言处理程序、网络与分布式软件系统、标准库程序、服务性程序等。 应用软件是指用户为解决特定应用领域问题而开发的程序,例如科学计算、工程设计、数据统计与信息处理等领域的专用软件。 2.软件和硬件的逻辑功能等价性 在计算机中,最基本的操作(如算术与逻辑运算)通常由硬件直接实现,而更复杂的功能则可由软件完成。对于某一特定功能,既可采用硬件实现,又可通过软件实现;从用户视角看,在相同规范下,二者在逻辑功能上是等价的。这一性质称为软/硬件逻辑功能的等价性。例如,浮点运算既可由专用浮点运算器硬件实现,又可通过软件子程序模拟;在相同输入和数值规范(如IEEE 754)下,二者产生一致的数值结果,但硬件实现的效率通常远高于软件。 软/硬件逻辑功能的等价性是计算机系统设计的重要依据。如何合理划分软/硬件的功能边界,是计算机体系结构研究的核心问题之一。在系统设计过程中,必须综合考虑设计目标、成本效益与技术可行性等因素,明确哪些功能由硬件承担,哪些功能由软件实现。 1.2.4计算机系统的层次结构 如图1.2所示,计算机系统采用多级层次结构,通过逐层抽象隔离复杂的硬件实现与高层应用需求。从用户的应用问题到物理器件,每层都向上提供简洁的接口,向下依赖更底层的功能实现。这种分层设计不仅明确了软/硬件的职责边界,还使系统开发和维护得以并行高效进行。 第1章 计算机系统概述 应用(问题) 最终用户 软件 算法与编程 程序员 操作系统/虚拟机 指令集体系结构(ISA) 硬件 微体系结构 架构师 功能部件/RTL 电路与器件 电子工程师 图1.2计算机系统的层次结构示意图 1.算法和编程 解决应用问题需要先将其抽象为一个正确的算法描述。随后,程序员将该算法用编程语言编写成程序。与自然语言不同,编程语言语法严谨、无二义性,能够精确描述计算机的执行顺序。 (1) 编程语言 编程语言可分为高级语言与低级语言。高级语言独立于计算机底层硬件结构,是主流软件开发语言;低级语言则紧密依赖机器结构,特指机器语言及其符号化形式——汇编语言。 考点追踪 三种编程语言的特点(2015、2024) 1)机器语言。又称二进制代码语言,由0和1组成的指令序列构成。程序员需要熟记每条指令的二进制编码。它是计算机唯一能直接识别和执行的语言。 2)汇编语言。采用英文助记符(如 mov、add)或其缩写代替二进制指令,显著提升了可读性与记忆性。但汇编程序不能被硬件直接执行,必须通过一个称为汇编程序的系统软件的翻译,将其转换为机器语言程序后,才能在计算机上运行。 3) 高级语言。如C、C++、 Java等,允许程序员以接近自然语言的方式描述问题求解过程,极大提高了开发效率。高级语言程序通常需经编译程序处理:或先编译为汇编语言,再经汇编生成机器语言;或直接编译为目标机器的机器语言程序。 (2) 翻译程序 考点追踪 各种翻译程序的概念(2016) 高级语言源程序必须转换为机器语言程序才能被计算机直接执行,用于完成该转换的系统软件称为翻译程序,转换后生成的程序称为目标程序。翻译程序主要分为以下三类: 1)汇编程序(汇编器):将汇编语言源程序翻译为机器语言目标程序。 2)解释程序(解释器):逐条翻译并立即执行高级语言源程序语句,不生成独立的目标程序。 3)编译程序(编译器):将高级语言源程序一次性翻译为汇编语言或机器语言目标程序。 2.操作系统 所有的语言处理系统都必须在操作系统提供的运行环境中执行;操作系统通过对计算机硬件及其底层结构的抽象,构建出一台可供程序员使用的虚拟机。 3.指令集体系结构 指令集体系结构(Instruction Set Architecture,ISA) 是计算机软/硬件之间的关键接口,它从程序员和编译器的视角,完整地定义了软件可直接使用的硬件功能。主要包括:指令格式、操作类型、寻址方式,以及可访问的寄存器等硬件资源。 因此,ISA 构成了软件所能“感知”到的计算机功能视图,也被称为软件可见部分。我们编写的机器语言程序,本质上就是一串严格遵循该ISA 规范的指令序列;而硬件执行程序的过程,就是逐条解释并完成这些指令所规定操作的过程。 6 2027年计算机组成原理考研复习指导 4.微体系结构 微体系结构(又称微架构)是处理器内部的硬件组织方式,用于实现ISA定义的功能。如果说ISA定义了“做什么”,那么微架构则决定了“怎么做”。其核心设计包括数据通路组织、控制单元实现、流水线级数、缓存层次结构以及分支预测机制等。 例如,加法操作可能通过串行进位加法器、超前进位加法器,甚至专用的SIMD单元来实现,这些都属于微体系结构的范畴。相同的ISA可对应多种不同的微构架。以Intel x86为例,不同代际的处理器(如 Core、Skylake、Alder Lake)均遵循同一套ISA规范,但内部组织方式差异显著,体现了微架构的多样性与演进性。 1.2.5计算机系统的不同用户 根据用户使用计算机完成任务的性质,可将用户划分为以下四类角色。 最终用户:直接操作应用程序完成特定任务的人员,如使用办公软件、浏览网页等的人员。他们通过操作系统提供的界面与计算机交互,无须了解底层技术细节。 系统管理员:负责配置、管理和维护计算机系统,确保其稳定高效运行的人员。主要职责包括安装软/硬件、管理用户账户、数据备份与系统升级等。 应用程序员:使用高级语言开发应用软件,以满足最终用户在办公、娱乐等领域的特定需求的人员。 系统程序员:设计并开发操作系统、编译器、数据库管理系统等核心系统软件的人员。 在实际使用中,同一用户可能在不同场景下承担多种角色。例如,一名计算机专业的学生:网上购物时是最终用户,管理磁盘、备份数据时是系统管理员,编写应用程序作业时是应用程序员,而参与操作系统开发时则是系统程序员。计算机系统采用层次化结构构建,不同用户正是依据其角色,工作在系统相应的抽象层级上的。 如图1.3所示,指令集体系结构(ISA)位于计算机软/硬件的交界处,是硬件功能的集中体现,也是软件执行的基础。ISA以下为硬件层,包括CPU、主存和I/O设备等物理组件;ISA以上为软件层,涵盖系统软件与应用软件。不同用户工作在以ISA为基础逐层构建的抽象层次上。 最终用户 应用程序 应用程序员 系统管理员 系统程序员 编译程序 操作系统 汇编程序 指令集体系结构(ISA) CPU 主存 I/O 数字逻辑及电路设计 图1.3计算机系统的层次与各层用户 系统程序员工作在机器语言层面,直接面向ISA;系统管理员工作在操作系统层面;应用程序员(高级语言程序员)工作在高级语言层面;最终用户则通过应用程序完成任务,处于最上层。在计算机系统中,下层机器的结构特性对上层用户通常是“透明”的。例如,ISA之下的硬件实现细节对高级语言程序员是透明的,他们无须了解底层机制即可进行开发。 第1章 计算机系统概述 7 1.2.6 计算机系统的工作原理 1.“存储程序”工作方式 “存储程序”工作方式规定:在程序执行前,需将其包含的指令和数据预先加载到主存储器中;一旦启动,计算机便无须人工干预,自动逐条取出并执行指令。如图1.4所示,程序的执行是一个周而复始的指令执行过程。每条指令的执行通常包括以下步骤:从主存储器中取指令(地址由程序计数器PC提供)、对指令译码、取操作数、执行操作,并将结果写回存储器。 2.从源程序到可执行文件 考点追踪 翻译过程的四个阶段(2022) 在计算机中编写的C语言程序,必须经过编译与链接过程,转换为一系列低级机器指令,并按特定格式封装为可执行目标文件,最终以二进制形式存储于磁盘。以UNIX系统中的GCC编译器为例,给定源程序文件hello.c,系统通过四个阶段生成可执行文件hello,如图1.5所示。 1)预处理阶段:预处理器(cpp)处理源文件中以#开头的预处理指令,如将#include 替换为对应头文件的完整内容,生成预处理后的C文件hello.i。 2)编译阶段:编译器(cc1)将hello.i翻译为汇编程序hello.s,其中每条语句以文本形式描述一条低级机器指令。 3)汇编阶段:汇编器(as)将hello.s转换为机器语言指令,生成可重定位目标文件hello.o。 8 2027年计算机组成原理考研复习指导 该文件为二进制格式,包含代码、数据及符号信息。 4) 链接阶段:链接器(ld)将hello.o与标准C库中所需的函数(例如printf)进行链接,解析外部符号引用,最终生成完整的可执行文件hello,并保存至磁盘。 3. 指令执行过程的简要描述 可执行文件中的代码段由一条条机器指令构成。每条指令是一串二进制编码,用于指示CPU完成一个特定的基本操作。指令的执行可被建模为经典的“取指—译码—执行”三阶段循环。掌握这一抽象模型,对于理解软件如何驱动硬件至关重要。读者可能会自然地追问:“这个循环在硬件上究竟是如何一步步实现的?”这正是“计算机组成原理”课程要回答的核心问题之一。为保障初学阶段概念的清晰性,避免过早陷入复杂的硬件细节,控制器的工作原理、数据通路的结构、时序信号的控制等具体实现技术,已系统性地安排在第5章“中央处理器”中。届时,我们将基于前述抽象模型,深入硬件内部,揭示其底层工作原理。 1.2.7 本节习题精选 单项选择题 01. 完整的计算机系统应包括( )。 A. 运算器、存储器、控制器 B. 外部设备和主机 C. 主机和应用程序 D. 配套的硬件设备和软件系统 02. 冯·诺依曼机的基本工作方式是( )。 A. 控制流驱动方式 B. 多指令多数据流方式 C. 微程序控制方式 D. 数据流驱动方式 03. 冯·诺依曼机工作方式的基本特点是( )。 A. 程序一边被输入计算机一边被执行 B. 程序直接从磁盘读到CPU执行 C. 按地址访问指令并自动按序执行程序 D. 程序自动执行而数据手工输入 04. 以下关于计算机各部件功能的叙述中,错误的是( )。 A. 运算器(ALU)仅用来完成算术运算 B. 存储器用来存放指令和数据 C. 控制器负责指挥和协调计算机各部件 D. 输入/输出设备用来完成用户和计算机之间的信息交换 05. 计算机系统采用层次化结构,从最上层的应用程序到最底层的硬件,其典型层次自上而下依次为( )。 A. 高级语言虚拟机→操作系统虚拟机→汇编语言虚拟机→机器语言机器 B. 高级语言虚拟机→汇编语言虚拟机→机器语言机器→操作系统虚拟机 C. 高级语言虚拟机→汇编语言虚拟机→操作系统虚拟机→机器语言机器 D. 操作系统虚拟机→高级语言虚拟机→汇编语言虚拟机→机器语言机器 06. 下列关于计算机系统层次结构的说法中,正确的是( )。 A. 高级语言程序经编译生成汇编语言后,可直接在机器上执行 B. ISA仅定义指令功能,不涉及硬件实现细节 C. 同一ISA可由不同微体系结构实现,软件无须修改即可兼容 第1章计算机系统概述 D.高级语言中的每条语句与ISA的机器指令一一对应 07.关于编译程序和解释程序,下列说法中错误的是()。 A.编译程序和解释程序的作用都是将高级语言程序转换为机器语言程序 B.编译程序编译时间较长,运行速度较快 C.解释程序方法较简单,运行速度也较快 D.解释程序将源程序翻译成机器语言,并且翻译一条以后,立即执行这条语句 08.只有当程序执行时才将源程序翻译成机器语言,并且一次只能翻译一行语句,边翻译边执行的是()程序,把汇编语言源程序转换为机器语言程序的过程是()。 I.编译Ⅱ.目标Ⅲ.汇编Ⅳ.解释 A.Ⅰ、ⅡB.Ⅳ、ⅡC.Ⅳ、ⅠD.Ⅳ、Ⅲ 09.下列关于各种级别语言的描述中,错误的是()。 A.可用高级语言和低级语言编写出功能等价的程序 B.低级语言的执行效率一般情况下高于高级语言 C.机器语言源程序可在机器上直接执行,而高级语言和汇编语言源程序不可以 D.汇编语言与机器结构无关 10.下列关于机器指令和汇编指令的叙述中,错误的是()。 A.可以直接用机器语言(机器指令)编写程序 B.汇编指令和机器指令都能被计算机直接执行 C.汇编语言和机器语言都与计算机系统结构相关 D.汇编指令和机器指令一一对应,功能相同 11.【2015统考真题】计算机硬件能够直接执行的是( )。 I.机器语言程序Ⅱ.汇编语言程序Ⅲ.硬件描述语言程序 A.仅ⅠB.仅Ⅰ、ⅡC.仅Ⅰ、ⅢD.Ⅰ、Ⅱ、Ⅲ 12.【2016统考真题】将高级语言源程序转换为机器级目标代码文件的程序是( )。 A.汇编程序B.链接程序C.编译程序D.解释程序 13.【2019统考真题】下列关于冯·诺依曼机基本思想的叙述中,错误的是( )。 A.程序的功能都通过中央处理器执行指令实现 B.指令和数据都用二进制数表示,形式上无差别 C.指令按地址访问,数据都在指令中直接给出 D.程序执行前,指令和数据需预先存放在存储器中 14.【2022统考真题】将高级语言源程序转换为可执行目标文件的主要过程是( )。 A.预处理→编译→汇编→链接B.预处理→汇编→编译→链接 C.预处理→编译→链接→汇编D.预处理→汇编→链接→编译 1.2.8答案与解析 单项选择题 01.D 选项A是计算机主机的组成部分,而选项B、C只涉及计算机系统的部分内容,都不完整。 02.A 冯·诺依曼机的基本工作方式是控制流驱动方式,也就是按照指令的执行序列,依次读取指令,然后根据指令所含的控制信息,调用数据信息进行处理。因此,在执行程序的过程中,始终 10 2027年计算机组成原理考研复习指导 以控制流为驱动工作的因素,而数据流则是被动地被调用处理。 03. C 冯·诺依曼机的核心特征包括“存储程序”、程序和数据统一存储、按地址访问,以及指令的自动顺序执行。其基本工作方式是:程序以二进制形式预先存入主存储器,CPU依据程序计数器 (PC)提供的地址逐条取出指令,并自动按序执行,无须人工干预。 04. A 运算器 (ALU)不仅负责算术运算,还承担逻辑运算(如与、或、非、移位等),因此选项A限定为“算术运算”是片面的,表述错误。选项B、C和D的描述明显正确。 05. C 计算机系统通常被抽象为多层虚拟机结构。用户程序以高级语言编写,在高级语言虚拟机上运行;经编译后生成汇编代码,在汇编语言虚拟机上抽象执行;但实际指令需要由操作系统加载、调度并管理资源,因此操作系统构成操作系统虚拟机层;最终,所有操作由机器语言机器执行。该层次自上而下为“高级语言虚拟机→汇编语言虚拟机→操作系统虚拟机→机器语言机器”。 06. C 汇编语言仍需汇编为机器码才能执行。ISA 是软/硬件的抽象接口,定义了软件可见的处理器行为(如指令、寄存器、寻址方式等),而非仅描述功能。同一ISA 可由不同微体系结构(如流水线、缓存设计等)实现,软件无须修改即可兼容,选项C正确。高级语言高度抽象,与机器指令无直接对应关系,仅汇编语言与ISA 指令基本一一对应。 07. C 编译程序是先完整编译后运行的程序,如C、C++等;解释程序是逐句翻译且边翻译边执行的程序,如JavaScript、Python等。解释程序要边翻译成机器语言边执行,因此一般速度较编译程序慢。为增加对该过程的理解,附C语言编译链接的过程: 源程序(c)→C编译器→汇编语言源程序→汇编程序→可重定位目标文件→链接程序→可执行文件 08. D 解释程序的特点是翻译一句执行一句,边翻译边执行;由高级语言转化为汇编语言的过程称为编译,把汇编语言源程序翻译成机器语言程序的过程称为汇编。 09. D 在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编程序转换为机器指令。特定的汇编语言与特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。 10. B 计算机只能直接执行机器指令,而汇编指令需要通过汇编程序转换为机器指令才能被计算机直接执行。 11. A 硬件能直接执行的只能是机器语言(二进制编码),汇编语言是增强机器语言的可读性和记忆性的语言,经过汇编后才能被执行。 12. C 翻译程序是指把高级语言源程序转换为机器语言程序的软件。翻译程序有两种:一种是编译程序,它将源程序一次全部翻译成目标程序,并且会生成目标代码文件。另一种是解释程序,它将源程序的一条语句翻译成对应的机器目标代码,并立即执行,翻译一句执行一句,并且不会生成目标代码文件。汇编程序也是一种翻译程序,它把汇编语言源程序翻译为机器语言程序。 第1章 计算机系统概述 11 13. C 冯·诺依曼机的功能部件包括输入设备、输出设备、存储器、运算器和控制器,程序的功能都通过中央处理器(运算器和控制器)执行指令,选项A正确。指令和数据以同等地位存放于存储器内,形式上无差别,只在程序执行时具有不同的含义,选项B正确。指令按地址访问,数据由指令的地址码指出,除立即寻址外,数据均存放在存储器内,选项C错误。在程序执行前,指令和数据需预先存放在存储器中,中央处理器可以从存储器存取代码,选项D正确。 14. A 将源程序转换为可执行目标文件的过程分为预处理、编译、汇编、链接四个阶段。 1.3 计算机的性能指标 1.3.1计算机的主要性能指标 1.运算速度 考点追踪 提高系统性能的综合措施(2010) (1)吞吐量和响应时间 ●吞吐量。指系统在单位时间内处理请求的数量。它受多个环节影响,包括信息输入内存的速度、CPU取指令的速度、数据在内存中读写的速率,以及结果输出到外部设备的效率。由于主存储器在这些环节中扮演关键角色,其存取性能对系统吞吐量有显著影响。 ● 响应时间。指从用户发出请求到系统返回所需结果的总等待时间,通常包括CPU 时间(程序实际运行时间)和等待时间(如磁盘访问、内存访问、I/O操作等所花费的时间)。 (2)主频和CPU时钟周期 考点追踪时钟脉冲信号和时钟周期的相关概念 (2019) • CPU时钟周期。机器内部主时钟脉冲的宽度,是CPU工作的最小时间单位。 时钟脉冲由机器脉冲源产生,经整形和分频后形成。 时钟周期通常以相邻状态单元间组合逻辑电路的最大延迟时间为基准确定;在流水线结构中,则以指令流水线的每个流水段的最大延迟时间为准。 考点追踪 主频和时钟周期的转换计算 (2013) • 主频(CPU 时钟频率)。机器内部主时钟的频率,即时钟周期的倒数,是衡量处理器速度的重要参数。对于同一个型号的计算机,主频越高,执行指令的每个步骤所需时间越短,运算速度越快。直观理解,主频表示每秒包含的时钟周期数。 注 意 CPU时钟周期 =1/主频。主频单位为赫兹(Hz),如10Hz表示每秒10个时钟周期。 (3) CPI (Cycles Per Instruction) ,执行一条指令所需的时钟周期数 考点追踪 IPS的相关计算 (2023) 不同指令所需的时钟周期数可能不同,因此对于一个程序或一台机器来说,其CPI是指该程序或该机器指令集中的所有指令执行所需的平均时钟周期数,即平均CPI. 12 2027年计算机组成原理考研复习指导 • IPS (Instructions Per Second) ,即每秒执行多少条指令,IPS= 主频/平均CPI. (4)CPU执行时间,运行一个程序所花费的时间 考点追踪 CPU执行时间的相关计算(2012、2013、2014、2017、2022、2023) CPU执行时间 =CPU时钟周期数/主频 =(指令条数×CPI)÷主频 上式表明,CPU 性能(以执行时间衡量)取决于三个要素:指令条数、CPI和主频,三者之间存在制约关系。例如,采用更复杂的指令集 (如CISC)可能会减少程序所需的指令条数,但往往会导致CPU控制逻辑更复杂,从而延长时钟周期,限制主频的提升;反之,精简指令集(如RISC)虽然可能会增加程序所需的指令条数,但有助于缩短时钟周期、提高主频。 【例1.1】假定计算机M1和M2具有相同的指令集体系结构,M1的主频为2GHz,程序P在M1上的运行时间为10s.M2采用新技术可使主频大幅提升,但其平均CPI也增加到M1 的1.5倍。则M2的主频至少需提升到多少,才能使程序P在M2上的运行时间缩短为6s? 解: 程序P在M1上的时钟周期数=指令条数×平均CPI=CPU执行时间×主频=10s×2GHz=2×10¹⁰. M2的平均CPI为M1的1.5倍,因此程序P在 M2上的时钟周期数= 1 . 5 × 2 × 1 0^{1 0} = 3 × 1 0^{1 0}。 要使程序P在M2上的运行时间缩短至6s,则M2所需的主频至少为 程序P在M2上的时钟周期数÷CPU执行时间= 3 × 1 0^{1 0} ÷ 6 s = 5 G H z 由此可见,M2的主频是M1的2.5倍,但其实际性能仅提升至M1的1.67倍。 (5) MIPS(Million Instructions Per Second) ,每秒执行多少百万条指令 考点追踪 MIPS相关的计算(2012、2013) MIPS= 指令条数÷(CPU执行时间×10⁶)= 主频÷(CPI×10⁶). MIPS用于不同机器间的性能比较存在明显缺陷:不同机器的指令集架构各异,指令的功能强度往往不等。例如,M1中一条指令完成的操作在M2上可能需多条指令实现;同时,各机器的CPI与时钟周期也不同,导致同一条指令的实际执行时间差异显著。 (6) FLOPS(Floating-point Operations Per Second) ,每秒执行的浮点运算次数 考点追踪浮点运算指标的概念(2011、2021) MFLOPS (Million FLOPS) : 百万(10⁶) 次浮点运算/秒。 GFLOPS (Giga FLOPS) : 十亿 (10⁹) 次浮点运算/秒。 TFLOPS (Tera FLOPS) : 万亿 (10¹²) 次浮点运算/秒。 PFLOPS (Peta FLOPS) : 千万亿 (10¹⁵) 次浮点运算/秒。 ·EFLOPS (Exa FLOPS) : 百亿亿 (10¹⁸) 次浮点运算/秒。 ●ZFLOPS (Zetta FLOPS): 十万亿亿 (10²¹) 次浮点运算/秒。 注 意 在描述存储容量、文件大小等时,K、M、G、T通常基于2的幂次(如1 K b = 2^{1 0}b);而在描述速率、频率等时,k、M、G、T通常基于10的幂次(如11 k b / s = 1 0^{3}b / s)。习惯上,前者用大写K,后者用小写k,但其他前缀(M、G等)均为大写,具体含义需结合上下文判断。 2.基准程序 基准程序(Benchmarks)是一组专门用于性能评测的典型程序,旨在模拟真实应用场景下的负载,从而较为准确地反映系统在实际使用中的运行效率。通过在不同机器上运行相同的基准程 第1章计算机系统概述 序,并比较其执行时间,可以客观地评估和对比各系统的性能。 基准程序测评的局限性:其性能常依赖于某些关键代码片段。硬件或编译器开发者可能对此进行针对性优化,使这些片段执行极快,却无法代表系统处理一般负载的能力,导致评测结果失真。因此,应结合具体应用领域选择合适的基准程序,并辅以多种评测手段综合判断。 1.3.2本节习题精选 一、单项选择题 01.关于CPU主频、CPI、MIPS、MFLOPS,说法正确的是()。 A.CPU主频是指CPU执行指令的频率,CPI是执行一条指令平均使用的频率 B.CPI是执行一条指令平均使用CPU时钟的个数,MIPS描述一条CPU指令平均使用的CPU时钟周期数 C.MIPS是描述CPU执行指令的频率,MFLOPS是计算机系统的浮点数指令 D.CPU主频是CPU使用的时钟频率,CPI是执行一条指令平均使用的CPU时钟周期数 02.在用于科学计算的计算机中,标志系统性能的最有用的参数是()。 A.主时钟频率 B.主存容量 C.MFLOPS D.MIPS 03.在计算机M1和计算机M2上分别运行功能完全相同的高级语言程序,程序在M1和M2上的平均CPI相等,则对于该类程序而言()。 A.M1和M2执行速度相等 B.M1和M2中主频高的计算机执行速度快 C.M1和M2中主频低的计算机执行速度快 D.无法确定哪台机器的执行速度快 04.计算机中,CPU的CPI与下列()因素无关。 A.时钟频率 B.系统结构 C.指令集 D.计算机组织 05.某基准程序在机器A上运行的时间是20s,而在机器B上运行的时间是16s,那么相对来说,下列给出的结论中,()是正确的。 A.所有程序在机器A上都比在机器B上运行速度慢 B.机器B的速度是机器A的1.25倍 C.机器A的速度是机器B的1.25倍 D.机器A比机器B慢1.25倍 06.机器A的主频为800MHz,某程序在机器A上运行需要12s。现在硬件设计人员想设计机器B,希望该程序在机器B上的运行时间能缩短为8s,使用新技术后可使机器B的主频大幅度提高,但在机器B上运行该程序所需的时钟周期数为在机器A上的1.5倍,则机器B的主频至少应为()。 A.800MHz B.1.2GHz C.1.5GHz D.1.8GHz 07.下列可用于评价计算机系统性能的指标是()。 I.MIPS II.IPC III.CPI IV.字长 A. I、III B. I、III和IV C. I、II和III D.全部 08.计算机的机器字长与下列()指标最密切相关。 A.运算速度 B.存取速度 C.内存容量 D.运算精度 09.假定编译器对高级语言的某条语句可以编译生成两种不同的指令序列,A、B和C三类指令的CPI和两种不同序列所含的三类指令条数如下表所示,两个指令序列都在时钟周 14 2027年计算机组成原理考研复习指导 期为2ns的机器上运行,则下列结论中正确的是( )。 指令类型 CPI 序列一的指令条数 序列二的指令条数 A 1 1 2 B 2 1 1 C 3 4 2 A.序列一的MIPS数比序列二多50,序列一的执行速度比序列二快10ns B.序列一的MIPS数比序列二多50,序列二的执行速度比序列一快 10ns C.序列二的MIPS数比序列一多50,序列一的执行速度比序列二快10ns D.序列二的MIPS数比序列一多50,序列二的执行速度比序列一快10ns 10.用一台40MHz的CPU执行标准测试程序,共包含100条指令,它所包含的指令混合比和不同指令的CPI见下表。该段程序的平均CPI和程序的执行时间分别为( )。 指令类型 CPI 指令混合比 指令类型 CPI 指令混合比 算术和逻辑 1 60% 转移 4 12% 高速缓存命中的访存 2 18% 高速缓存失效的访存 8 10% A. 2.26,5.6×10⁻⁸s B. 2.26,5.6×10⁻⁶s C. 2.24,5.6×10⁻⁶s D. 2.24,5.6×10⁻⁸s 11.下列给出了改善计算机性能的4种措施: I.用更快的处理器来替换原来的慢速处理器 Ⅱ.增加同类处理器个数,使得不同的处理器同时执行程序 Ⅲ.优化编译生成的代码,使得程序执行的总时钟周期数减少 IV.减少指令执行过程中的访存时间 对于某个特定的程序,在以上措施中,能缩短其执行时间的措施是( )。 A. I、Ⅱ和Ⅲ B. I、Ⅱ和Ⅳ C. I、Ⅲ和Ⅳ D.全部 12.【2010统考真题】下列选项中,能缩短程序执行时间的措施是( )。 I.提高CPU时钟频率Ⅱ。优化数据通路结构Ⅲ。对程序进行编译优化 A. 仅I和Ⅱ B. 仅I和III C. 仅Ⅱ和Ⅲ D. I、II、III 13.【2011统考真题】下列选项中,描述浮点数操作速度指标的是( )。 A. MIPS B. CPI C. IPC D. MFLOPS 14.【2012统考真题】假定基准程序A在某计算机上的运行时间为 100s,其中90s为CPU时间,其余为I/O时间。若CPU速度提高50%,I/O速度不变,则运行基准程序A所耗费的时间是( )。 A. 55s B. 60s C. 65s D. 70s 15.【2013统考真题】某计算机的主频为1.2GHz,其指令分为4类,它们在基准程序中所占比例及CPI如下表所示。 指令类型 所占比例 CPI 指令类型 所占比例 CPI A 50% 2 C 10% 4 B 20% 3 D 20% 5 该机的MIPS数是( )。 A. 100 B. 200 C. 400 D. 600 16.【2014统考真题】程序P在机器M上的执行时间是20s,编译优化后,P执行的指令数减少到原来的70%,而CPI增加到原来的1.2倍,则P在M上的执行时间是( )。 第1章 计算机系统概述 15 A. 8.4s B. 11.7s C. 14s D. 16.8s 17.【2017统考真题】假定计算机M1和M2具有相同的指令集体系结构(ISA),主频分别为1.5GHz和1.2GHz.在M1和M2上运行某基准程序P,平均CPI分别为2和1,则程序P在M1和M2上运行时间的比值是( )。 A. 0.4 B. 0.625 C. 1.6 D. 2.5 18.【2021统考真题】2017年公布的全球超级计算机TOP 500排名中,我国“神威·太湖之光”超级计算机蝉联第一,其浮点运算速度为93.0146 PFLOPS,说明该计算机每秒完成的浮点操作次数约为( )。 A . 9 . 3 × 1 0^{1 3}次 B . 9 . 3 × 1 0^{1 5}次 C. 9.3千万亿次 D. 9.3亿亿次 19.【2022统考真题】某计算机主频为1GHz,程序P运行过程中,共执行了10000条指令,其中,80%的指令执行平均需1个时钟周期,20%的指令执行平均需 10个时钟周期。程序P的平均CPI和CPU执行时间分别是( )。 A. 2.8,28μs B. 28,28μs C. 2.8,28ms D. 28,28ms 20.【2023统考真题】若机器M的主频为1.5GHz,在M上执行程序P的指令条数为5×10⁵,P的平均CPI为1.2,则P在M上的指令执行速度和用户CPU时间分别为( )。 A. 0.8GIPS,0.4ms B.0.8GIPS,0.4μs C. 1.25GIPS,0.4m s D. 1.25GIPS,0.4μs 二、综合应用题 01.微机A和B是采用不同主频的CPU芯片,片内逻辑电路完全相同。 1)微机A的CPU主频为8MHz,微机B为12MHz,则微机A的CPU时钟周期为多少? 2)微机A的平均指令执行速度为0.4MIPS,微机A的平均指令周期为多少? 3)微机B的平均指令执行速度为多少? 02.某台计算机只有LOAD/STORE指令能对存储器进行读/写操作,其他指令只对寄存器进行操作。根据程序跟踪试验结果,已知每条指令所占的比例及CPI数如下表所示。 指令类型 指令所占比例 CPI 指令类型 指令所占比例 CPI 算术逻辑指令 43% 1 STORE指令 12% 2 LOAD指令 21% 2 转移指令 24% 2 求上述情况下的平均CPI. 假设程序由 M条指令组成。算术逻辑运算中 25%的指令的两个操作数中的一个已在寄存器中,另一个必须在算术逻辑指令执行前用LOAD指令从存储器中取到寄存器中。因此有人建议增加另一种算术逻辑指令,其特点是一个操作数取自寄存器,另一个操作数取自存储器,即寄存器-存储器类型,假设这种指令的 CPI 等于 2。同时,转移指令的CPI变为3.求新指令系统的平均CPI. 1.3.3 答案与解析 一、单项选择题 01. D CPU主频是指CPU使用的时钟频率,CPI是执行一条指令平均使用的CPU时钟周期数。 02. C MFLOPS是指每秒执行多少百万次浮点运算,该参数用来描述计算机的浮点运算性能,而用于科学计算的计算机主要评估浮点运算的性能。 16 2027年计算机组成原理考研复习指导 03.D CPU执行时间=指令条数×CPI×时钟周期,程序在M1和M2上的平均CPI相等,但影响CPU执行时间的因素还有指令条数和时钟周期,此外相同的高级语言程序在不同计算机上编译生成的机器指令条数可能不同,因此无法确定哪台机器执行该类程序的速度快。 04.A CPI是执行一条指令所需的时钟周期数,系统结构、指令集、计算机组织都会影响CPI,而时钟频率并不会影响CPI,但可加快指令的执行速度。例如,执行一条指令需要10个时钟周期,则一台主频为1GHz的CPU,执行这条指令要比一台主频为100MHz的CPU快。 05.B 机器的速度与基准程序在该机器上的运行时间呈相反关系,因此可知:机器B的速度/机器A的速度=基准程序在机器A上的运行时间/基准程序在机器B上的运行时间=20s÷16s=1.25。因此,可以说,机器B的速度是机器A的1.25倍,或者机器A的速度是机器B的0.8倍。 06.D 该程序在机器A上需要的时钟周期数为12×800M=9600M,因为在机器B上运行该程序需的时钟周期数为在机器A上的1.5倍,故在机器B上需要的时钟周期数为9600M×1.5=14400M=14.4G,要求运行时间为8s,故机器B的时钟频率为14.4G÷8=1.8GHz。 07.D 显然,MIPS、CPI、字长都是评价计算机系统性能的指标。IPC表示每个时钟周期运行多少条指令,它是CPI的倒数。 08.D 机器字长越长,数据的位数越多,定点数或浮点数所表示及运算的精度就越高,选项D正确。机器字长与运算速度的关系不大,机器字长与存取速度和内存容量基本没有关系。 09.D MIPS=主频÷(CPI×10⁶),主频=1/时钟周期=1/2ns=500MHz,序列一的CPI=(1×1+1×2+4×3)÷6=15÷6=2.5,序列二的CPI=(2×1+1×2+2×3)÷5=10÷5=2,故序列一的MIPS=500×10⁶÷(2.5×10⁶)=200,序列二的MIPS=500×10⁶÷(2×10⁶)=250。CPU执行时间=指令条数×CPI×时钟周期=程序的时钟周期数×时钟周期,序列一所需的时钟周期数是15,序列二所需的时钟周期数是10,所以序列一的执行时间为15×2ns=30ns,序列二的执行时间为10×2ns=20ns。 10.C 标准测试程序共包含4种指令,CPI是这4种指令的数学期望,平均CPI=1×60%+2×18%+4×12%+8×10%=2.24。程序的执行时间T=CPI×T_IC×I,其中T_IC是一个时钟周期(它是主频f的倒数),I是指令条数,因此T=CPI×T_IC×I=CPI×(1/f)×I=5.6×10⁶s。 11.D 采用更快的处理器,可以减少单条指令的执行时间;增加处理器的个数,可以增加程序执行的并行性,缩短程序的执行时间;优化编译代码,可以减少指令之间的各种冲突;访存时间占指令执行的大部分时间,减少访存时间同样可以大大加快指令的执行时间。 12.D CPU时钟频率(主频)越高,完成指令的一个执行步骤所用的时间就越短,执行指令的速度就越快,说法I正确。数据通路的功能是实现CPU内部的运算器和寄存器及寄存器之间的数据交换,优化数据通路结构,可以有效提高计算机系统的吞吐量,从而加快程序的执行,说法II正确。计算机程序需要先转化成机器指令序列才能最终得到执行,通过对程序进行编译优化可以得到更优的指令序列,从而使得程序的执行时间也越短,说法III正确。 第1章 计算机系统概述 17 13.D MIPS是每秒执行多少百万条指令,适用于衡量标量机的性能。CPI是平均每条指令的时钟周期数。IPC是CPI的倒数,即每个时钟周期执行的指令数。MFLOPS是每秒执行多少百万条浮点数运算,用来描述浮点数运算速度,适用于衡量向量机的性能。 14.D 程序A的运行时间为100s,减去CPU时间90s,剩余10s为I/O时间。CPU提速50%后运行基准程序A所耗费的时间是T=90÷1.5+10=70s。 误区 CPU速度提高50%,而误认为CPU时间减少一半,从而误选选项A。 15.C 基准程序的CPI=2×0.5+3×0.2+4×0.1+5×0.2=3。计算机的主频为1.2GHz,即1200MHz,因此该机器的MIPS=1200÷3=400。 16.D 假设原来的指令条数为x,则原CPI为20fx(f为CPU的时钟频率),经过编译优化后,指令条数减少到原来的70%,即指令条数为0.7x,而CPI增加到原来的1.2倍,即24fx,则现在程序P在机器M上的执行时间就为:(指令条数×CPI)/f=(0.7x×24×fx)/f=24×0.7=16.8s。 17.C 运行时间=指令数×CPI/主频。M1的时间=指令数×2/1.5,M2的时间=指令数×1/1.2,两者之比为(2/1.5):(1/1.2)=1.6。 18.D PFLOPS=每秒千万亿(10¹⁵)次浮点运算。故93.0146PFLOPS≈每秒9.3×10^{16}次浮点运算,即每秒9.3亿亿次浮点运算。 19.A CPI指平均每条指令的执行需要多少个时钟周期。80%的指令执行平均需要1个时钟周期,20%的指令执行平均需要10个时钟周期,因此CPI=80%×1+20%×10=2.8。计算机主频为1GHz,程序P共执行10000条指令,平均每条指令需要2.8个时钟周期,因此,CPU执行时间=(10000×2.8)÷10^{9}=2.8×10^{-5}s=28\mu s。 20.C 程序P的指令条数为5×10^{5},平均CPI为1.2,程序P的总时钟周期数为5×10^{5}×1.2=6×10^{5},主频1.5GHz说明1s有1.5G=1.5×10^{9}个时钟周期,故指令执行速度=主频/平均CPI=1.5×10^{9}÷1.2=1.25GIPS,用户CPU时间=6×10^{5}÷(1.5×10^{9})s=4×10^{-4}s=0.4ms。 二、综合应用题 01.【解答】 1)微机A的CPU主频为8MHz,所以微机A的CPU时钟周期=1÷8MHz=0.125μs。 2)微机A的平均指令周期=1÷0.4MIPS=2.5μs。 3)微机A平均每条指令的时钟周期数=2.5μs÷0.125μs=20。 因微机A和B的片内逻辑电路完全相同,所以微机B平均每条指令的时钟周期数也为20。 因为微机B的CPU主频为12MHz,所以微机B的CPU时钟周期=1÷12MHz=1/12μs。 微机B的平均指令周期=20×(1/12)=5/3μs。 微机B的平均指令执行速度=1÷(5/3)μs=0.6MIPS。 18 2027年计算机组成原理考研复习指导 【另解】微机B的平均指令执行速度=微机A的平均指令执行速度×(12/8)=0.4MIPS×(12/8)=0.6MIPS. 02.【解答】 ① 本计算机共包含4种指令,则CPI就是这4种指令的数学期望,即 CPI=1×43%+2×21%+2×12%+2×24%=1.57 ② 设原指令总数为M,因为新增的算术操作有取操作数的功能,替代了LOAD的功能,所以新指令总数为 M+(0.25×0.43M)-(0.25×0.43M)-(0.25×0.43M)=0.8925M 增加另一种算术逻辑指令后,每种指令所占的比例及CPI如下表所示: 指令类型 指令所占比例 CPI 算术逻辑指令 (0.43M-0.43M×0.25)/0.8925M=0.3613 1 算术逻辑指令(新) (0.43M×0.25)/0.8925M=0.1204 2 LOAD指令 (0.21M-0.43M×0.25)/0.8925M=0.1149 2 STORE指令 0.12M/0.8925M=0.1345 2 转移指令 0.24M/0.8925M=0.2689 3 所以CPI'=1×0.3613+2×0.1204+2×0.1149+2×0.1345+3×0.2689=1.9076. 1.4 本章小结__ 本章开头提出的问题的参考答案如下。 1)主频高的CPU一定比主频低的CPU性能更高吗?为什么? 不一定。CPU性能受多种因素影响,不能仅凭主频高低判断优劣。主频表示CPU内部时钟信号的振荡频率,反映指令执行的节奏快慢,但并不直接等同于实际运算速度。实际性能还取决于微架构设计、流水线深度、缓存容量与层级、指令集效率、位宽、并行能力等。例如,一个主频较低但架构先进的CPU,可能因更高的每周期指令数(IPC)而超越主频更高但架构陈旧的处理器。因此,在特定场景下,主频较高的CPU实际性能反而可能更低。 2)翻译程序、汇编程序、编译程序与解释程序有何区别?各自的特征是什么? 详见本章常见问题和易混淆知识点1. 3)不同级别的语言所编写的程序有何差异?哪一类语言可被硬件直接执行? 机器语言由二进制指令构成,与硬件指令一一对应,可被CPU直接执行;汇编语言使用助记符,需要汇编后执行;高级语言更抽象,需要编译或解释转换。只有机器语言能被硬件直接执行。 1.5 常见问题和易混淆知识点 - 1.翻译程序、解释程序、汇编程序、编译程序的区别和联系是什么? 翻译程序是将一种编程语言转换为另一种语言的程序,主要包括编译程序、解释程序和汇编 第1章 计算机系统概述 程序。编译程序将高级语言源程序一次性全部翻译为目标程序(如机器码或汇编代码),生成可独立执行的文件;源程序不变时,无须重复编译。解释程序逐条读取源程序语句,翻译成机器指令并立即执行,通常不生成可存储的目标程序,执行过程为“边翻译边执行”。汇编程序是一种特殊的翻译程序,将汇编语言源程序翻译为机器语言程序。编译程序与汇编程序的区别:若源语言为高级语言(如C、Java),目标语言为低级语言(如汇编语言或机器语言),则称为编译程序;若源语言为汇编语言,目标语言为机器语言,则称为汇编程序。 2.什么是透明性?透明是指什么都能看见吗? 在计算机领域,透明性指从某类用户的视角无法感知某一事物或属性的存在,这与日常生活中“透明=可见”的含义恰好相反。例如,对高级语言程序员而言,指令的格式、机器结构、数据格式等均是透明的;而对汇编或机器语言程序员,这些细节则不是透明的。CPU中的指令寄存器(IR)、存储器地址寄存器(MAR)和存储器数据寄存器(MDR),对所有程序员均透明。 3.计算机体系结构和计算机组成的区别与联系是什么? 计算机体系结构是指程序员可见的机器属性,包括指令集、数据类型、寻址方式等,属于抽象层面的定义。计算机组成则是体系结构的具体实现,涉及硬件如何完成取指、译码、执行等操作,包含大量对程序员透明的细节。例如,是否提供乘法指令属于体系结构问题,而采用何种电路(如阵列乘法器或移位相加)实现该指令,则属于组成问题。因此,两台机器可具有相同体系结构,但组成方式迥异,从而在性能与成本上呈现显著差异。 4.基准程序执行得越快说明机器的性能越好吗? 一般而言,基准程序的执行速度可反映机器性能,但单一程序通常只覆盖特定工作负载,难以全面代表系统整体性能,因其对计算、访存、I/O等资源的需求各异。 购买王道书,就上 王道官方考研书店 wangdao.taobao.com 淘 第2章 数据的表示和运算 【考纲内容】 (一)数制与编码 进位计数制及其相互转换;定点数的编码表示 (二)运算方法和运算电路 基本运算部件:加法器;算术逻辑单元(ALU) 加减运算:补码加减运算器;标志位的生成 乘除运算:乘除运算的基本原理;乘法电路和除法电路的基本结构 (三)整数的表示和运算 无符号整数的表示和运算;有符号整数的表示和运算 (四)浮点数的表示和运算 浮点数的表示:IEEE 754标准;浮点数的加减运算 【复习提示】 本章内容较为繁杂,由于计算机采用二进制表示数据,其表示与运算机制不同于日常使用的十进制,理解起来有一定的难度。纵观历年统考真题,C语言中 unsigned、 short、 int、 long、 float、 double等基本数据类型的表示范围、运算规则、溢出判断,以及类型转换,IEEE754浮点数的表示、特点与加减运算,均为考查重点,需要牢固掌握。 在学习本章时,建议读者思考以下问题: 1)在计算机中,为什么要采用二进制来表示数据? 2)计算机在字长足够的情况下能够精确地表示每个数吗?若不能,请举例说明。 3)字长相同的情况下,浮点数和定点数的表示范围与精度有什么区别? 4)用移码表示浮点数的阶码有什么好处? 建议读者在学习过程中尝试回答这些问题,本章末尾将提供参考答案。 2.1 数制与编码 2.1.1 进位计数制及其相互转换 考点追踪 采用二进制编码的原因(2018) 在计算机系统内部,所有信息均采用二进制进行编码,主要原因如下。 1)二进制只有两个状态,只需使用具有两种稳定物理状态的器件即可表示每一位,硬件实现成本较低。例如,可用高电平和低电平分别表示1和0。 2)二进制的1和0恰好对应逻辑值“真”与“假”,为计算机实现逻辑运算和程序中的条件判断提供了直接支持。 第2章 数据的表示和运算 21 3)二进制的运算规则极为简单,可通过基本的逻辑门电路高效实现各类算术与逻辑操作。 1.进位计数制 常用的进位计数制包括十进制、二进制、八进制和十六进制。十进制是日常生活中最常用的计数制,而计算机内部主要使用二进制,并常借助八进制和十六进制来简化表示。 在进位计数制中,基数是指每个数位所能使用的不同数码的个数。例如,十进制的基数为10(数码为0~9),计数时遵循“逢十进一”的规则。以十进制数101为例,百位的1表示100,个位的1表示1,二者数值不同,是因为每一位的实际值等于该数码乘以其所在位置的位权。一个进位制数的数值,等于各位数码与其位权的乘积之和。 一个r进制数(K_{n}K_{n-1}\dotsc K_{0}K_{-1}\dotsc K_{-m})的数值可表示为 K_{n}r^{n}+K_{n-1}r^{n-1}+\cdots +K_{0}r^{0}+K_{-1}r^{-1}+\cdots +K_{-m}r^{-m}=\sum_{i=n}^{m}K_{i}r^{i} 式中,r是基数;r是第i位的位权;K_{i}是第i位的数码,取值范围为0,1,\cdots ,r-1。 1)二进制。基数为2,数码为0和1,计数“逢二进一”。第i位的位权为2^{i}。 2)八进制。基数为8,数码为0~7,计数“逢八进一”。由于8=2^{3},每3位二进制数恰好对应1位八进制数,两者转换十分便捷。 3)十六进制。基数为16,数码为0~9和A~F(A~F分别代表10~15),计数“逢十六进一”。由于16=2^{4},每4位二进制数对应1位十六进制数,转换同样便捷。 为便于区分,常在数字后添加后缀字母来标识进制:B表示二进制数,O表示八进制数,D表示十进制数(通常省略),H表示十六进制数;此外,也常用前缀0x表示十六进制数。 2.不同进制数之间的相互转换 (1)二进制数转换为八进制数和十六进制数 对于一个既有整数部分又有小数部分的二进制数,转换时以小数点为界分别处理:整数部分,从小数点向左,每3位(八进制)或每4位(十六进制)分为一组,若最左侧不足3位或4位,则在高位补0;小数部分,从小数点向右,同样每3位或4位分为一组,若最右侧不足,则在低位补0。分组完成后,将每组直接替换为对应的八进制或十六进制数码即可。 【例2.1】将二进制数1111000010.01101转换为八进制数和十六进制数。 解: \begin{array}{ccc}\text{高位补}0,\text{凑足}3\text{位}&\text{分界点}&\text{低位补}0,\text{凑足}3\text{位} \\ \downarrow &\downarrow &\downarrow \\ \frac{001}{1}&\frac{111}{7}&\frac{000}{0}\quad\frac{010}{2}\quad\quad\frac{011}{3}\quad\frac{010}{2}& \\ \text{所以,对应的八进制数为}(1702.32)_{8}。&\end{array} \begin{array}{ccc}\text{高位补}0,\text{凑足}4\text{位}&\text{分界点}&\text{低位补}0,\text{凑足}4\text{位} \\ \downarrow &\downarrow &\downarrow \\ \frac{0011}{3}&\frac{1100}{C}&\frac{0010}{2}\quad\quad\frac{0110}{6}\quad\frac{1000}{8} \\ \text{所以,对应的十六进制数为}(3C2.68)_{16}。&\end{array} 反之,将八进制数或十六进制数转换为二进制数时,只需将每位数码分别替换为对应的3位或4位二进制数(必要时去掉整数最高位或小数最低位的0)。八进制数与十六进制数之间的转换,通常先转换为二进制数,再转为目标进制,这是最直接且不易出错的方式。 (2)任意进制数转换为十进制数 采用按权展开相加法:将各位数码与其对应位权(基数的幂次)相乘,再求和。 例如,(11011.1)_{2}=1×2^{4}+1×2^{3}+0×2^{2}+1×2^{1}+1×2^{0}+1×2^{-1}=27.5。 22 2027年计算机组成原理考研复习指导 (3)十进制数转换为任意进制数 考点追踪 十进制小数转换为二进制小数(2021、2022) 通常采用基数乘除法,对整数部分和小数部分分别处理: 1)整数部分使用除基取余法:不断除以目标进制的基数,记录余数,直至商为0;最先得到的余数为最低位,最后得到的为最高位。 2)小数部分使用乘基取整法:不断乘以基数,记录整数部分,直至小数部分为0或达到所需精度。最先得到的整数为最高位,最后得到的为最低位。 最终将两部分的转换结果拼接,即得到目标进制数。 【例2.2】将十进制数123.6875转换为二进制数。 解: 整数部分(除2取余): 除基 取余 2 12 3 1 最低位 2 61 、 2 3 0 0 ˇ 1 5 、 2 7 1 2日1 最高位 所以,整数部分123=(1111011)₂. 小数部分(乘2取整): 取整 1 最高位 0 1 \frac{0 . 5 0 0 0 0}{1 . 0 0 0 0} 1 最低位 所以,小数部分0.6875=(0.1011)₂, 因此,123.6875=(1111011.1011)₂. 注 意 关于除基取余法和乘基取整法的原理,建议结合r进制数的数值定义公式理解,避免死记硬背。并非所有十进制小数都能用有限位二进制小数精确表示。一个十进制小数能被有限位二进制精确表示,当且仅当它可以表示成形如k/2"的分数。例如,0.3=3/10,而10不是2的幂(其质因数包含5),因此无法用有限位二进制精确表示。相反,任何有限位二进制小数都对应一个分母为 2 的幂的分数,因此总能精确地转换为十进制小数。这一特性在浮点数的表示与运算中尤为重要,需特别注意。 2.1.2定点数的编码表示 1.真值和机器数 在日常生活中,数通常用“+”或“-”号表示正负(正号常省略),如+15、-8.这类带有符号的数称为真值,即机器数所代表的实际数值。在计算机中,数的符号与数值部分一同编码:通常用“0”表示正,“1”表示负。这种将符号数字化的表示形式称为机器数。 例如,机器数0,101(逗号仅用于分隔符号位与数值位)表示真值+5. 第2章 数据的表示和运算 23 2.机器数的定点表示 根据小数点位置是否固定,计算机中的数值表示分为定点表示和浮点表示。定点表示用于表示定点小数和定点整数。 1)定点小数。表示纯小数,约定小数点位于符号位之后、数值部分最高位之前。若数据 X=x_{0}.x_{1}x_{2}\dotsc x_{n}(其中 x_{0} 为符号位,x_{1}\sim x_{n} 为数值位,x_{1} 为最高有效位),其在计算机中的表示形式如图 2.1 所示。 2)定点整数。表示纯整数,约定小数点位于数值部分最低位之后。若数据 X=x_{0}x_{1}x_{2}\dotsc x_{n}(其中 x_{0}为符号位,x_{1}\sim x_{n} 为数值位,x_{n} 为最低有效位),其表示形式如图 2.2 所示。 事实上,在机器内部并没有小数点,只是人为约定了小数点的位置。因此,在定点数的编码和运算中,无须区分该数表示的是小数还是整数,而只需关心符号位和数值位即可。 定点数的编码表示法主要有四种:原码、补码、反码和移码。 3.原码、补码、反码、移码 (1) 原码表示法 用机器数的最高位表示数的符号,其余各位表示数的绝对值。原码的定义如下。 [x]_{\text{原}}=\begin{cases}0,x,&0⩽x < 2^{n} \\ 2^{n}-x=2^{n}+|x|,&-2^{n} < x⩽0\end{cases} (x 是真值,字长为 n+1) 例如,若字长为 8 位,x_{1}=+1110,x_{2}=-1110,则其原码表示分别为 [x_{1}]_{\text{原}}=0,0001110,[x_{2}]_{\text{原}}=2^{7}+1110=1,0001110。 对于 n+1 位原码整数,其表示范围为 -(2^{n}-1)⩽x⩽2^{n}-1(关于原点对称)。 注意 零的原码表示有正零和负零两种形式,即 [+0]_{\text{原}}=0,0000000 和 [-0]_{\text{原}}=1,0000000。 原码表示的优点:① 与真值的对应关系简单、直观,转换简便;② 用原码实现乘除运算比较简便。缺点:① 零的表示不唯一,存在 ±0 两种编码;② 用原码实现加减运算比较复杂。 (2) 补码表示法 补码表示法的加法和减法运算均可通过加法器统一实现。正数的补码与原码相同,负数的补码等于模 (n+1) 位补码的模为 2^{n+1} 与该负数绝对值之差。补码的定义如下。 [x]_{\text{补}}=\begin{cases}0,x,&0⩽x < 2^{n} \\ 2^{n+1}+x=2^{n+1}-|x|,&-2^{n}⩽x < 0\end{cases}\quad(\mod2^{n+1}) 等价地,无论是正数还是负数,[x]_{\text{补}}=2^{n+1}+x-( -2^{n}⩽x < 2^{n}\mod2^{n+1})\)。 例如,若字长为 8 位,x_{1}=+1010,x_{2}=-1101,则其补码表示分别为 [x_{1}]_{\text{补}}=0,0001010,[x_{2}]_{\text{补}}=2^{8}-|x_{2}|=1,1110011。 考点追踪 补码的表示范围 (2010、2013、2014、2022) 对于 n+1 位补码整数,其表示范围为 -2^{n}⩽x⩽2^{n}-1(比原码多表示一个负数,即 -2^{n})。 • 几个特殊值的补码 (n+1 位): 24 2027年计算机组成原理考研复习指导 1)[+0]*=[-0]*=0,00... 0(全0),零的补码表示是唯一的。 (全1). 3)最大正整数:[2^{n} - 1]_{\ast} = 0 , 1 1 \dotsc 1(符号位为0,数值位全1). 4)最小负整数:[ - 2^{n}]_{\ast} = 1 , 0 0 \dotsc 0(符号位为1,数值位全0). ●模运算(了解) 在模运算中,一个数与它除以“模”后得到的余数是等价的。如A、B、M满足A=B+K×M(K为整数),记为A≡B(mod M),即A、B各除以M后的余数相同。在补码运算中,[A]*-[B]*=[A]*+M-[B]*, 而M-[B]*=[-B]*,因此补码能够借助加法运算实现减法运算。 ●补码与真值之间的转换 考点追踪 补码和真值的相互转换(2020、2023) 真值转换为补码:对于正数,与原码的方式一样。对于负数,符号位取1,其余各位由其绝对值“按位取反,末位加1”得到。补码转换为真值:若符号位为0,则直接读作正数。若符号位为1,则真值为负数,其绝对值由补码数值部分“按位取反,末位加1”得到。 ·变形补码 为便于溢出检测,可采用双符号位的补码表示(又称变形补码),双符号位00表示正数,11表示负数。若总位数为n+2(高2位为符号位,其余为数值位),则变形补码定义为 在双符号位中,左符表示真正的符号位,右符用于判断“溢出”。 (3)反码表示法(了解即可) 反码可视为从原码转换为补码的中间表示形式。 正数的反码与其原码相同。负数的反码由其原码的数值部分按位取反(末位不加1)得到。 反码表示存在明显不足:①零的表示不唯一(存在±0两种编码);②表示范围与相同字长的原码相同,比补码少一个最小负数(-2")。因此,反码在计算机中极少使用。 (4)移码表示法 移码主要用于表示浮点数的阶码,且用于表示整数。其核心思想是将真值x加上一个固定偏置值,实现数轴整体右移。设字长为n+1位,偏置值通常取2",则移码定义为 [x]+ =2"+x(-2"≤x<2") 注 意 在IEEE754标准的浮点数中,k位阶码的偏置值为2^{k - 1} - 1 ,如8位阶码的偏置值为127. 例如,若字长为8位,偏置值为2^{7} , x_{1} = + 1 0 1 0 1 , x_{2} = - 1 0 1 0 1 ,则其移码表示分别为[[x_{1}]_{稀} = 2^{7} +1 0 1 0 1 = 1 , 0 0 1 0 1 0 1 ; [ x_{2} ]_{\circled{B}} = 2^{7} + ( - 1 0 1 0 1 ) = 0 , 1 0 1 0 1 1 0 移码(设字长为n+1,偏置值为2")的主要特点如下: ①零的表示唯一,|[ + 0 ]_{稀} = 2^{n} + 0 = [ - 0 ]_{稀} = 2^{n} - 0 = 1 , 0 0 . . . 0(n个0). ②在相同字长下,移码与补码仅符号位相反(将补码的最高位取反即得移码)。 ③移码全0时,对应真值的最小值-2";移码全1时,对应真值的最大值2"-1. ④移码保持真值的大小顺序:移码值越大,对应真值越大,便于阶码比较。 四种编码表示的总结如下: 考点追踪 补码大小的判断 (2015) ①正数的原码、反码、补码相同;移码则不同。 第2章数据的表示和运算 25 ②原码与反码在数轴上关于原点对称,二者都存在+0与-0。 ③补码与移码的表示不对称,零的表示唯一,且比原码和反码多表示一个负数(-2")。 ④原码可直观的比较大小(因数值部分即绝对值),而负数的补码和反码不能像原码那样直观判断。不过,在同为负数的前提下,补码或反码的数值部分越大,其真值也越大。 2.1.3整数的表示 1.无符号整数的表示 考点追踪机器码与补码、无符号数之间的转换(2021) 当所有二进制位均用于表示数值(无符号位)时,该编码称为无符号整数,简称无符号数。此时,数值隐含为非负整数。由于无须保留符号位,在相同字长下,无符号整数能表示的最大值大于有符号整数。无符号整数适用于仅涉及非负整数且结果不会产生负值的场景。例如,可用无符号整数进行地址运算,或用它来表示指针。 例如,8位无符号整数的最小值为0000,最大值为11111111(2⁸-1=255),表示范围为0~255;而8位有符号整数(补码表示)的最小值为10000000(-2⁷=-128),最大值为01111111(2⁷-1=127),表示范围为-128~-127。 2.有符号整数的表示 有符号整数通过在数值位前增设一位符号位(0表示正,1表示负)来表示正负。虽然原码、反码和补码均可用于表示有符号整数,但现代计算机统一采用补码,因其具有以下优势: ①零的表示唯一(无+0与-0之分)。 ②符号位可与数值位一同参与运算,使加减法统一为加法操作。 ③表示范围更大,比原码和反码多表示一个最小负数。 因此,n位有符号整数(补码)的表示范围为-2ⁿ⁻¹~2ⁿ⁻¹-1。 2.1.4C语言中的整数类型及类型转换 统考大纲要求考生具备分析高级程序设计语言(如C语言)中相关问题的能力,其中变量之间的类型转换是高频考点,需要深入掌握。 1.C语言中的整型数据类型 考点追踪int型数据的表示范围(2017、2019、2024) C语言提供了多种整型类型,其具体长度依赖于编译器和目标平台。常见情况如下: ●短整型:short(或short int),通常为16位。 ●整型:int,通常为32位。 ●长整型:long(或long int),在32位系统中为32位,在64位系统中通常为64位。 在上述类型前添加unsigned关键字,可定义对应的无符号类型(如unsigned int、unsigned short等)。若未显式指定signed或unsigned,则默认为有符号类型。 字符型(char,通常为8位)是一种特殊的整型,通常可按无符号整数解释。 在现代系统中,所有有符号整型均以补码形式存储。无符号整型则将全部位用于表示非负数值。因此,在相同位宽下,两者的取值范围不同。 2.整型数据的类型转换 定点数在类型转换过程中,若涉及字长变化,则会触发两种基本操作:位截断与位扩展。 1)位截断:当长类型转换为短类型时,系统直接丢弃高位,仅保留低位部分。由于目标类型的表示范围较小,截断可能导致数值发生变化,具有较强的隐蔽性。 26 2027年计算机组成原理考研复习指导 考点追踪零扩展和符号扩展的应用 (2012、2021、2024) 2)位扩展:当短类型转换为长类型时,系统通过填充高位来保持数值语义不变。具体扩展的方式取决于源数据的符号性: ● 零扩展:用于无符号数,在高位补0. ● 符号扩展:用于补码表示的有符号数,高位重复填充符号位。 C语言支持通过强制类型转换实现不同类型间的转换,其语法为“TYPEb=(TYPE)a”,转换结果是一个TYPE类型的值。根据源类型与目标类型的字长和符号性,可分为三种情形。 考点追踪 整型类型的相互转换 (2011、2016、2019、2024) (1)长类型转换为短类型:位截断 转换规则:保留低位,丢弃高位。 考虑如下代码片段: int x=165537, u=-34991; ∥int型为32位 short y=(short)x, v=(short)u; // short型为16位 printf("x=%d, y=%d\n", x, y); printf("u=%d, v=%d\n", u, v); 运行结果如下: x=165537, y=-31071 u=-34991, v=30545 其中,x,y,u,v的十六进制表示分别为0x000286A1,0x86A1,0xFFFF7751,0x7751.可见,当长类型转换为短类型时,系统直接截断高位,仅保留低位部分。由于目标类型的数值范围较小,这种位截断可能导致结果与原值在语义上不一致。由于x=165537超出了16位有符号整数的最大值(32767),截断后的位模式被解释为-31071,这并非运算溢出,而是位截断引起的语义变化。需要注意的是,此类转换不会触发任何异常或错误报告,具有很强的隐蔽性。 (2)相同字长的转换:仅改变解释方式 转换规则:二进制位模式保持不变,仅重新解释其含义。 考虑如下代码片段: short x=-4321; unsigned short y=(unsigned short)x; printf("x=%d, y=%u\n", x, y); 运行结果如下: x=-4321, y=61215 有符号数x为负数,而无符号数y只能表示非负值。从输出结果看,y的值似乎与x毫无关联;但将二者转换为二进制形式后(见表2.1),可观察到:short型强制转换为unsigned short型后,所有二进制位均保持不变,x按补码规则解释为有符号数,而y则按无符号规则解读。 表2.1 y与x的位级表示对比 变 量 值 二进制位 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 x -4321 1 1 1 0 1 1 1 1 0 0 0 1 1 1 1 1 y 61215 1 1 1 0 1 1 1 1 0 0 0 1 1 1 1 1 这表明:相同字长的整型类型转换不改变位模式,仅改变对这些位的解释方式。 (3)短类型转换为长类型:位扩展 转换规则:若源数据为有符号数,则执行符号扩展;若源数据为无符号数,则执行零扩展。考虑如下代码片段: 第2章数据的表示和运算 27 short x=-4321; int y=x; unsigned short u=(unsigned short)x; unsigned int v=u; printf("x=%d, y=%d\n", x, y); printf("u=%u, v=%u\n", u, v); 运行结果如下: x=-4321, y=-4321 u=61215, v=61215 其中, x,y,u,v的十六进制表示分别为0xEF1F,0xFFFFEF1F,0xEF1F,0x0000EF1F。可见,短类型转换为长类型时,要对高位部分进行扩展,扩展方式取决于源数据的符号性。可见,x为有符号数,符号位为1,扩展时高16位补1;u为无符号数,扩展时高16位补0。 2.1.5 本节习题精选 单项选择题 01.若十进制数为137.5,则其八进制数为( )。 A. 89.8 B. 211.4 C. 211.5 D. 1011111.101 02.一个16位无符号二进制数的表示范围是( )。 A. 0~65536 B. 0~65535 C. -32768~32767 D. -32768~32768 03.下列说法有误的是( )。 A.任何二进制整数都可以用十进制表示 B.任何二进制小数都可以用十进制表示 C.任何十进制整数都可以用二进制表示 D.任何十进制小数都可以用二进制表示 04.对真值0表示形式唯一的机器数是( )。 A.原码 B.补码和移码 C.反码 D.以上都不对 05.若[X]补=1.1101010,则[X]原=( )。 A. 1.0010101 B. 1.0010110 C. 0.0010110 D. 0.1101010 06.若X为负数,则由[X]补求[-X]补是将( )。 A.[X]补各值保持不变 B.[X]补符号位变反,其他各位不变 C.[X]补除符号位外,各位变反,末位加1 D.[X]补连同符号位一起变反,末位加1 07.8位原码能表示的不同数据有( )个。 A. 15 B. 16 C. 255 D. 256 08.一个n+1位整数x原码的数值范围是( )。 A. -2"+1-32,应当满足( )。 A. x_{1}为 0,其他各位任意 B. x_{1}为 1,其他各位任意 C. x_{1}为 1,x_{2}\cdots x_{6}中至少有一位为 1 D. x_{1}为 0,x_{2}\cdots x_{6}中至少有一位为 1 12.设 x 为整数,[x]_\text{补}=1.x_{1}x_{2}x_{3}x_{4}x_{5},若要 x < -16,x_{1}\sim x_{5}应满足的条件是( )。 A. x_{1}\sim x_{5}至少有一个为 1 B. x_{1}必须为 0,x_{2}\sim x_{5}至少有一个为 1 C. x_{1}必须为 0,x_{2}\sim x_{5}任意 D. x_{1}必须为 1,x_{2}\sim x_{5}任意 13.设 x 为真值,x^*为其绝对值,满足 [-x^*]_\text{补}=[-x]_\text{补},当且仅当( )。 A. x 任意 B. x 为正数 C. x 为负数 D. 以上说法都不对 14.假定一个十进制数为 -66,按补码形式存放在一个 8 位寄存器中,该寄存器的内容用十六进制表示为( )。 A. C2H B. BEH C. BDH D. 42H 15.设机器数采用补码表示(含 1 位符号位),若寄存器内容为 9BH, 则对应的十进制数为( )。 A. -27 B. -97 C. -101 D. 155 16.若寄存器内容为 10000000,若它等于 -0,则为( )。 A. 原码 B. 补码 C. 反码 D. 移码 17.若寄存器内容为 11111111,若它等于 +127,则为( )。 A. 反码 B. 补码 C. 原码 D. 移码 18.若寄存器内容为 11111111,若它等于 -1,则为( )。 A. 原码 B. 补码 C. 反码 D. 移码 19.若寄存器内容为 00000000,若它等于 -128,则为( )。 A. 原码 B. 补码 C. 反码 D. 移码 20.若二进制定点小数真值是 -0.1101,机器表示为 1.0010,则为( )。 A. 原码 B. 补码 C. 反码 D. 移码 21.下列为 8 位移码机器数 [x]_{\text{移}},求 [-x]_{\text{移}} 时,( )将会发生溢出。 A. 11111111 B. 00000000 C. 10000000 D. 01111111 22.一个 8 位的二进制整数由 2 个 “0” 和 6 个 “1” 组成,采用补码或者移码表示,则下列说法中正确的是( )。 A. 若采用移码表示,偏置值为 127,则此整数最小为 -64 B. 若采用移码表示,偏置值为 128,则此整数最大为 123 C. 若采用补码表示,则此整数最小为 -96 D. 若采用补码表示,则此整数最大为 252 23.用 2 个 “1” 和 6 个 “0” 组成的 8 位二进制补码,所能表示的最大整数和最小整数之差为( )。 A. 223 B. 128 C. 191 D. 159 24.计算机内部的定点数大多用补码表示,以下是一些关于补码特点的叙述: Ⅰ.零的表示是唯一的 Ⅱ.符号位可以和数值部分一起参加运算 Ⅲ.和其真值的对应关系简单、直观 Ⅳ.减法可用加法来实现 在以上叙述中,( )是补码表示的特点。 A. I 和 II B. I 和 III C. I 和 II 和 III D. I 和 II 和 IV 25.在计算机中,通常用来表示主存地址的是( )。 第2章数据的表示和运算 29 A.移码 B.补码 C.原码 D.无符号数 26.16位补码整数0x8FA0扩展为32位应该是( )。 A.0x00008FA0 B.0xFFFF8FA0 C.0xFFFFFA0 D.0x80008FA0 27.【2012统考真题】假定编译器规定int型和short型长度分别为32位和16位,执行下列C语言语句: unsigned short x=65530; unsigned int y=x; 得到y的机器数为( )。 A.00007FFAH B.0000FFFAH C.FFFF 7FFAH D.FFFF FFFAH 28.【2015统考真题】由3个“1”和5个“0”组成的8位二进制补码,能表示的最小整数是( )。 A.-126 B.-125 C.-32 D.-3 29.【2016统考真题】有如下C语言程序段: short si=-32767; unsigned short usi= si; 执行上述两条语句后,usi的值为( )。 A.-32767 B.32767 C.32768 D.32769 30.【2018统考真题】冯·诺依曼结构计算机中的数据采用二进制编码表示,其主要原因是( )。 I.二进制的运算规则简单 II.制造两个稳态的物理器件较容易 III.便于用逻辑门电路实现算术运算 A.仅I、II B.仅I、III C.仅II、III D.I、II和III 31.【2019统考真题】考虑以下C语言代码: unsigned short usi=65535; short si= usi; 执行上述程序段后,si的值是( )。 A.-1 B.-32767 C.-32768 D.-65535 32.【2021统考真题】已知有符号整数用补码表示,变量x,y,z的机器数分别为FFFDH,FFDFH,7FFCH,下列结论中,正确的是( )。 A.若x,y和z为无符号整数,则z-32,数值位 x_{1}x_{2}x_{3}x_{4}x_{5}x_{6}需大于 100000,即 x_{1}必须为 1,而 x_{2}\cdots x_{6}中至少有一位为 1。 【特殊值法】对于选项 A,取 1,000000,真值为 -64,错误。对于选项 B,取 1,100000,真值为 -32,错误。对于选项 C,取 1,100001,真值为 -31,符合。对于选项 D,取 1,000001,真值为 -63,错误。 12.C 解题思路与上题类似(也可采用特殊值解法,请读者自行思考),-16 的补码为 1,10000,根据负数补码判断大小的规则:数值位部分越小,其绝对值越大,即负得越多。因此,若要x < -16,数值位 x_{1}x_{2}x_{3}x_{4}x_{5}需小于 10000,即 x_{1}必为 0,而 x_{2}\sim x_{5}任意。 13.D 当 x 为 0 或为正数时,满足 [-x^*]_{\text{补}}=[-x]_{\text{补}},B 为充分条件,因此选项 B 错误。而 x 为负数时,-x 为正数,而 -x^* 为负数,补码的表示是唯一的,显然二者不等,因此选项 C 错误。 第2章数据的表示和运算 31 14. B x=-66用二进制数表示,[x]原=11000010,则有[x]补=10111110=BEH。 15. C 9BH=(10011011)₂,最高位的1表示负数,所以其真值为(11100101)₂=-(64+32+4+1)=-101。 16. A 值等于-0说明只可能是原码或反码的因为补码和移码表示0时是唯一的,没有+0和-0之分),[-0]原=10000000,[-0]反=11111111。 17. D 这里寄存器长度为8,[+127]原=[+127]反=[+127]补=01111111,又知同一数值的移码和补码除最高位相反外,其他各位相同,则[+127]移=11111111或[+127]移=2⁷+01111111=11111111。 18. B 这里寄存器长度为8,[-1]补=[10000001]补=11111111。 19. D 这里寄存器长度为8,[-128]移=2⁷+(-10000000)=00000000。 20. C 真值-0.1101,对应的原码表示为1.1101,补码表示为1.0011,反码表示为1.0010,移码通常用于表示阶码,不用来表示定点小数。 21. B 选项B对应8位最小的值-128,而-x=128发生溢出,因此无法表示其移码。 22. A 当采用补码表示时,要使得数值最大,就要让符号位为0,且把“1”放在高位,得到的补码为0111110B=126;要使得数值最小,就要让符号位为1,且把“1”放在低位,得到的补码为1001111B=-97。当采用移码表示时,设偏置值为128,要使得数值最大,就要把“1”放在高位,得到的移码为1111100B-1000000B=252-128=124;设偏置值为127,要使得数值最小,则应把“1”放在低位,得到的移码为0011111B-0111111B=11000000B=-64,选项A正确。 23. A 在8位补码中,符号位为最高位。要使数值最大,符号位为0,其余位中将两个“1”尽可能置于高位,最大值为01100000=96。要使数值最小,符号位为1,此时需要将另一个“1”置于最低位(其余为0),得最小补码为10000001=-127。二者之差为96-(-127)=223。 24. D [+0]和[-0]补是相同的,所以说法Ⅰ正确。在进行补码定点数的加减运算时,符号位作为数的一部分参加运算,说法Ⅱ正确,[A]补-[B]补=[A]补+[-B]补,即将减法采用加法实现,说法Ⅳ正确。实际上,补码和其真值的对应关系远不如原码和其真值的对应关系简单直观,说法Ⅲ错误。 25. D 主存地址都是正数,因此不需要符号位,即直接采用无符号数表示。 26. B 16位扩展为32位,符号位不变,附加位是符号位的扩展。该数是一个负数,需用1来填补。A是一个正数,C的数值位发生变化,D用0来填充附加位,均不正确。 27. B 将一个16位unsigned short型数转换为32位unsigned int型数时,因为都是无符号数,新表示形式的高位用0填充。16位无符号整数所能表示的最大值为65535,其十六进制表示为FFFH,因此x的十六进制表示为FFFH-5H=FFFAH,所以y的十六进制表示为0000FFFAH。 32 2027年计算机组成原理考研复习指导 排除法:先直接排除C、D,然后分析余下选项的特征。A、B的值相差几乎近1倍,因此可以算出00010000H(接近B且好算的数)的值后,再推断出答案。 28.B 原码很容易判断大小。而负数的补码很难直接判断大小,可采用如下规则快速判断:对于负数,数值位部分越小,其绝对值越大,即负得越多。采用补码整数表示时,负数的符号位为1,因此剩下的两个“1”放在末位时其值最小,补码形式为10000011,转换为真值为-125。此外,考虑负数的补码转换为原码的方法,从右向左找到第一个数值为1的位,之后的每位进行取反操作,符号位不变,不难发现,当符号位为1,剩下的两个“1”放在末位时,补码的绝对值最大。 29.D 因C语言中的数据在内存中为补码表示形式,si对应的补码为1000000000000001B,最前面的一位“1”为符号位,表示负数,即-32767。由signed型数转换为等长的unsigned型数时,符号位成为数据的一部分,即负数转换为无符号数(正数)时,其数值将发生变化。usi对应的补码与si的相同,但表示正数,为32769。 30.D 对于说法Ⅰ,二进制只有0和1两种数值,运算规则较简单,都通过ALU转换为加法运算。对于说法Ⅱ,二进制数只需要高电平和低电平两个状态就可表示,这样的物理器件很容易制造。对于说法Ⅲ,二进制数与逻辑量相吻合。二进制的0和1正好与逻辑量的“真”和“假”相对应,因此用二进制数表示二值逻辑显得十分自然,采用逻辑门电路很容易实现运算。 31.A unsigned short型为无符号短整型,长度为2字节,因此unsigned short usi型转换为二进制代码即1111111111111111。short型为短整型,长度为2字节,在采用补码的机器上,short si的二进制代码为1111111111111111,因此si的值为-1。 32.D 若x,y和z均为无符号整数,则x>y>z,选项A和B错误。若x,y和z均为有符号整数,补码的最高位是符号位,0表示正数,1表示负数,因此z为正数,而x和y为负数。对于x和y的比较,数值位取反加1,可知x=-3,y=-33,所以x>y。选项D正确。 33.B n位补码整数的最小值是1,00..0(-2..1);最大值是0,11..1(2..1-1)。n位补码整数所能表示的范围是-2ⁿ-1~2ⁿ-1-1,32位补码整数所能表示的范围是-2³-2³-1。 34.D 在32位系统中,short通常为16位有符号整数。-32767的16位补码为1000000000000001。将其赋值给32位unsigned int时,先按符号扩展转换为32位有符号整数1111111111111100000000000001,再以无符号方式解释,其值为2³²-(2¹⁵-1)=2³²-2¹⁵+1。 2.2运算方法和运算电路 2.2.1基本运算部件 在计算机中,运算器由算术逻辑单元(Arithmetic Logic Unit, ALU)、移位器、状态寄存器(PSW)和通用寄存器组等组成。运算器的基本功能包括加、减、乘、除四则运算,与、或、非、 第2章数据的表示和运算 33 异或等逻辑运算,以及移位、求补等操作。ALU的核心部件是加法器。 1.一位全加器 全加器(FA)是最基本的加法单元,有三个输入:加数Aᵢ、加数Bᵢ与来自低位的进位Cᵢ₋₁,两个输出:本位和Sᵢ及向高位的进位Cᵢ。其逻辑表达式如下。 和表达式:Sᵢ=Aᵢ⊕Bᵢ⊕Cᵢ₋₁(当Aᵢ、Bᵢ、Cᵢ₋₁中有奇数个1时,Sᵢ=1,否则Sᵢ=0) 进位表达式:Cᵢ=AᵢBᵢ+(Aᵢ⊕Bᵢ)Cᵢ₋₁ 一位全加器的逻辑结构如图2.3(a)所示,其逻辑符号如图2.3(b)所示。 2.串行进位加法器 将n个全加器级联可构成n位串行进位加法器(又称行波进位加法器),如图2.4所示。其特点是进位信号逐级传递,每一级的进位输出直接作为下一级的进位输入。 图2.3一位全加器 2.串行进位加法器 将n个全加器级联可构成n位串行进位加法器(又称行波进位加法器),如图2.4所示。其特点是进位信号逐级传递,每一级的进位输出直接作为下一级的进位输入。 图2.4 n位串行进位加法器 图2.4中的加法器实现两个n位二进制数A=A_{n}A_{n-1}\cdots A_{1}和B=B_{n}B_{n-1}\cdots B_{1}逐位相加的功能,得到和S=S_{n}S_{n-1}\cdots S_{1}及最终进位C_{n}。例如,当A=1111,B=0001(4位)时,输出S=0000,C_{4}=1。由于位数固定,结果实际为模2^{n}的加法(溢出部分被丢弃)。 在串行进位加法器中,总运算延迟主要由进位信号从最低位传播到最高位的时间决定。位数越多,进位链越长,延迟越大。因此,缩短进位传递路径是提升加法器性能的关键。 *3.并行进位加法器 并行进位(也称先行进位)加法器能够显著提升加法运算速度,因为它能以几乎同时生成所有进位信号的方式工作,而非逐级传递进位。为了实现这一目标,n个一位全加器被连接至一个n位先行进位逻辑部件(CLA部件),以便几乎同时生成所有进位信号。因此,并行进位加法器对于较大位数的数据处理效率要高于串行进位加法器。图2.5展示了一个4位全先行进位加法器的例子。随着加法器位数的增加,电路设计复杂度也会相应提高,此处不再详述。 34 2027年计算机组成原理考研复习指导 4.带标志加法器 对于n位加法器来说,除了得到运算结果外,还要关注加法运算过程中是否发生了溢出、结果的正负性、结果是否为零等,这些信息对于程序的执行控制非常关键。为此,在n位加法器的基础上增加了额外的逻辑电路,不仅支持计算和/差,还能生成以下标志位:OF、CF、SF和ZF,每个标志占1位。图2.6展示了用全加器实现n位带标志加法器的电路示意图。 在图2.6中,溢出标志OF通过检测最高有效位的进位输入C_{n-1}与进位输出C_{n}是否不同决定,即OF=C_{n}\oplus C_{n-1},用于判断有符号数加法运算是否溢出:OF=1表示溢出,OF=0表示未溢出。符号标志SF等于结果的最高有效位,即SF=F_{n-1},用于指示有符号数加法运算结果的正负性:SF=0表示结果为正,SF=1表示结果为负。零标志ZF在结果的所有位均为0时设置为1,用于指示加减运算的结果是否为零:ZF=1表示结果为0,ZF=0表示结果非零。进位/借位标志CF用于判断无符号数的加减运算是否发生溢出:CF=1表示溢出,CF=0表示未溢出。 5.算术逻辑单元(ALU) ALU是一种功能较强的组合逻辑电路,能够执行多种算术与逻辑运算。其中,加法和减法由带标志加法器直接完成;乘法和除法则通常通过ALU配合控制逻辑,以多次加减和移位的方式迭代实现。此外,ALU还能执行与、或、非等基本逻辑运算。其基本结构如图2.7所示:A和B为两个n位操作数输入端,C_{in}为进位输入端,ALUop为操作控制信号,用于选择ALU执行的具体功能。例如,当ALUop选择加法(Add)时,ALU输出A+B+C_{in}。ALUop的位数决定了可支持的操作种类数量。例如,3位ALUop最多可支持8种不同操作。 图2.8展示了一位ALU的结构,可完成“与”“或”“加法”三种操作。其中,加法由一个全加器实现,逻辑运算由专用门电路并行计算,最终通过多路选择器(MUX)根据ALUop选择输出结果。由于有3种操作,ALUop至少需要2位。 第2章 数据的表示和运算 35 2.2.2 定点数的移位运算 当计算机中没有乘/除运算电路时,可以通过加法和移位相结合的方法来实现乘/除运算。对于任意二进制整数,左移一位,若未发生溢出,相当于乘以2(类似于十进制数左移一位相当于乘以10);右移一位,若忽略因移出而舍去的末位尾数,相当于除以2。 根据操作数的类型不同,移位运算可以分为逻辑移位和算术移位。 1. 逻辑移位 考点追踪 逻辑移位运算(2018) 逻辑移位将操作数视为无符号整数。逻辑移位的规则:左移时,高位移出,低位补0。若高位的1移出,则发生溢出。右移时,低位移出,高位补0。 例如,4位无符号数0001(+1)左移一位变为0010(+2),相当于乘以2,未溢出;0001(+1)右移一位变为0000(0),相当于除以2并舍弃小数部分。又如,1000(+8)左移一位变为0000(0),相当于乘以2,但结果超出了4位无符号数的表示范围,发生溢出。 2. 算术移位 考点追踪 算术移位运算(2012、2017、2018) 算术移位需要考虑符号位的问题,即将操作数视为有符号整数。有符号整数采用补码表示,因此对于有符号整数的移位操作应采用补码算术移位方式。算术移位的规则:左移时,高位移出,低位补0。若移出的高位与原符号位不同(左移后符号位改变),则发生溢出。右移时,低位移出,高位补符号位。若低位的1移出,则影响精度。 例如,4位补码0010(+2)左移一位变为0100(+4),未溢出;1001(-7)左移一位变为0010,符号由负变正,表明发生溢出(因为-14超出了4位补码的表示范围)。又如,1001(-7)右移一位变为1100(-4),保留了符号位,但丢失了最低有效位,影响精度。 2.2.3 定点数的加减运算 1. 补码加减运算 考点追踪 补码的加减运算(2009、2011、2017、2025) 补码加减运算规则简单,易于硬件实现。补码加减运算的公式如下(设字长为n+1)。 [A+B]_{\text{补}}=[A]_{\text{补}}+[B]_{\text{补}}\left(\bmod 2^{n+1}\right) [A-B]_{\text{补}}=[A]_{\text{补}}+[-B]_{\text{补}}\left(\bmod 2^{n+1}\right) 补码运算具有以下特点: 1)按二进制加法规则运算,逢二进一。 2)若做加法,则两个数的补码直接相加;若做减法,则将被减数与减数的负数补码相加。 36 2027年计算机组成原理考研复习指导 3)符号位与数值位一同参与运算,结果的符号位由运算自然得出。 4)运算结果自动截断为n+1位(模2^{n+1}),高位进位被丢弃,结果仍为补码形式。 【例2.3】设字长为8位(含1位符号位),A=15,B=24,求[A+B]_{\text{补}}和[A-B]_{\text{补}}。 解:A=+0001111,B=+0011000;求得[A]_{\text{补}}=00001111,[B]_{\text{补}}=00011000,[-B]_{\text{补}}=11101000。则:[A+B]_{\text{补}}=[A]_{\text{补}}+[B]_{\text{补}}=00001111+00011000=00100111,符号位为0,真值为+39。 [A-B]_{\text{补}}=[A]_{\text{补}}+[-B]_{\text{补}}=00001111+11101000=11110111,符号位为1,真值为-9。 2.溢出判别方法 考点追踪 补码运算的溢出判断(2010、2011、2014、2018、2021、2025) 补码加减运算仅在同号相加或异号相减时可能发生溢出。例如,两个正数相加结果为负,或一个负数减去一个正数结果为正。常用的溢出判别方法有以下三种。 (1)采用一位符号位 减法运算在机器中是用加法器实现的,因此加法和减法均可统一视为两个补码数相加。溢出仅发生在参与运算的两个数符号相同,而结果符号与之不同的情况下。设参与运算的两个操作数的符号位分别为A_{s}和B_{s},运算结果的符号为S_{s},则溢出逻辑表达式为 V=A_{s}B_{s}\overline{S}_{s}+A_{s}B_{s}S_{s} (2)采用一位符号位并结合进位情况 设符号位(最高位)产生的进位为C_{n},最高数值位(次高位)产生的进位为C_{n-1}。若C_{n}与C_{n-1}不同,则表示溢出。溢出逻辑表达式为 V=C_{n}\oplus C_{n-1} (3)采用双符号位 使用两个符号位S_{s1}、S_{s2}(S_{s1}为高位符号位),若两个符号位不同,则表示溢出。S_{s1}、S_{s2}的各种情况如下:① S_{s1}S_{s2}=00;表示结果为正数,无溢出。② S_{s1}S_{s2}=01;表示结果正溢出。③ S_{s1}S_{s2}=10;表示结果负溢出。④ S_{s1}S_{s2}=11;表示结果为负数,无溢出。溢出逻辑表达式为 V=S_{s1}\oplus S_{s2} 在上述三种方法中,若V=0,则表示无溢出;若V=1,则表示有溢出。 3.加减运算电路 考点追踪 补码加法器的实现原理(2011) 在计算机中,无论是无符号数还是有符号数的加减运算,均采用同一套硬件电路实现,即“一套电路,两种语义”。图2.9所示为一个加减运算部件,其输入端包括两个n位操作数X和Y,以及一个控制信号Sub。其中,Y分成两路:一路直接接入二选一多路选择器(MUX),另一路经n位反相器后接入同一选择器。控制信号Sub不仅决定选择哪一路数据进入加法器,还在执行减法时作为最低位的进位输入。输出端包括n位运算结果F以及各类标志位。 第2章 数据的表示和运算 37 (1)加法运算的工作原理 无论是无符号数还是补码表示的有符号数,其加法均通过同一加法器电路完成。当执行加法操作时 (Sub=0),电路实现过程如下。 输入:X直接接入加法器的一端;Y接入MUX. 控制信号:Sub=0,同时作为加法器的最低位进位输入C_{i n} = 0 。 运算:MUX在Sub=0时选择Y直接通过,加法器执行X + Y + C_{i n}(X + Y) ,输出n位结果F和进位输出Cout,并生成状态标志位。 语义解释: 1)若X、Y被视为无符号数,则结果。F=(X+Y) mod 2"。当X+Y≥2"时,产生进位C_{o u t} = 1 ,表示发生无符号溢出;此时,标志(C F = C_{o u t}反映进位状态。 2)若X、Y被视为有符号数([X]补、[Y]补),则结果F = [X + Y]_{\f} 。此时,若两个操作数同号而结果异号(如正+正→负),则表示有符号溢出,由溢出标志OF指示。 (2)减法运算的工作原理 无论是无符号数还是补码表示的有符号数,其减法也通过同一加法器电路实现。当执行减法操作时 (Sub=1),电路实现过程如下: 输入:X直接接入加法器的一端;Y接入MUX. 控制信号:Sub=1,同时作为加法器的最低位进位输入C_{i n} = 1 。 运算:MUX在Sub=1时选择反相后的Y输出,加法器执行X + \overline{Y} + C_{i n}(X + \overline{Y} + 1) ,输出n位结果F和进位输出Cout,并生成状态标志位。 语义解释: 1)若X、Y被视为无符号数,则该运算等价于计算X-Y+2"(模2"运算)①: ●X≥Y时,X - Y + 2^{n}\ge 2^{n} ,有进位C_{o u t} = 1 ,舍去高位后F=X-Y,表示无借位(结果非负)。 ●XB.如A-B=010-001=001, 结果非零ZF=0,无借位CF=0. 若AB; 当CF =1时(此时ZF必为0,无须额外检查),说明AB.无溢出示例:如[A]*-[B]*=010-001=010+111=(1)001, 得ZF=0, OF=0,SF=0; 有溢出示例:[A]*-[B]补=011-101=011+011=110,得ZF=0, OF=1, SF=1. 若AB; 当ZF=0且OF≠SF(或OF⊕SF=1)时,说明AB;当发生溢出时,即OF=1时,若SF=1,则必然是正数减去负数发生溢出导致结果为负,说明A>B. 当ZF=0且未发生溢出时,即OF=0时,若SF=1,则表示结果为负,说明A>1+[y]补<<1=01000100>>1+11011100<<1=00100010+10111000=11011010=DAH。x右移移出了0,没有溢出或损失精度;y为负数,左移后,符号位仍为1,没有溢出;且从最后一步加法操作来看,一个正数和一个负数相加,必然不会溢出。 21. A [x]补=44H=01000100,[y]补=DCH=11011100。执行x-2y时,先将y算术左移一位,得到10111000,未溢出,然后各位取反,再与x相加,做减法时Sub=1,即01000100+01000111+1=10001100(8CH),两个加数的符号都为0,而结果的符号为1,因此发生了溢出,即OF=1。 22. A 无符号数和有符号数一起参与运算时,计算机按无符号数来解释最终的执行结果,因此j-1的结果是32个全1,会被解释成最大的无符号数。65536=2¹⁶,当把si强制转换为short型时,直接保留机器数的末16位,即16个全0,因此,当i和j-1进行比较时,根据无符号数的解释,OF标志是没有意义的,即根据CF位可知i小于j-1,因此最终输出“王道”。 23. C 无符号乘法无须辅助位,电路结构更简单。当控制逻辑的输入是“00”或“11”时,ALU执行空操作,仅移位。因结果为有符号数,P和Y的右移必须为算术右移,以保持符号位不变,选项C正确。溢出判断依据是P的所有位是否都等于Y的符号位,而非P是否全为0。 第2章 数据的表示和运算 51 24.B 该补码除法器在正式迭代之前会先判断:若被除数的绝对值小于除数的绝对值,则直接置商为0、余数为被除数,跳过全部移位和加减操作,从而最快完成。在选项B中,Y=-2^{31},绝对值为2^{31};Q=-1,绝对值为1。由于\mid Q\mid < \mid Y\mid,满足快速退出条件,故执行时间最短。 25.D C语言中的整型数据为补码形式,int型为32位,short型为16位,因此x、y的机器数写为0000 007FH、FFF7H。执行z=x+y时,x为int型,y为short型,因此需将y的类型强制转换为int型,在机器中通过符号位扩展实现,y的符号位为1,因此在y的前面添加16个1,即可将y强制转换为int型,其十六进制形式为FFFF FFF7H。然后执行加法,即0000 007FH+FFFF FFF7H=0000 0076H,其中最高位的进位1自然丢弃。 26.B 本题的真正意图是考查补码的表示范围,采用补码乘法规则计算出四个选项是费力不讨好的做法,且极易出错。8位补码所能表示的整数范围为-128~+127。将四个数全部转换为十进制数:r_{1}=-2,r_{2}=-14,r_{3}=-112,r_{4}=-8,得r_{2}×r_{3}=1568,远超出了表示范围,发生溢出。 27.A x*2,将x算术左移一位为1 1101000;y/2,将y算术右移一位为1 1011000,均无溢出或丢失精度。补码相加为1 1101000+1 1011000=1 1000000,亦无溢出。 28.C 8位定点补码表示的数据范围为-128~127,若运算结果超出这个范围,则会溢出。对选项A,x+y=103-25=78,符合范围。对选项B,-x+y=-103-25=-128,符合范围。对选项D,-x-y=-103+25=-78,符合范围。对选项C,x-y=103+25=128,超过127。 29.C 利用补码转换为原码的规则:负数的符号位不变数值位取反加1;正数补码等于原码。两个机器数对应的原码是[x]_{\text{原}}=80000021H,对应的数值是-33,[y]_{\text{原}}=[y]_{\text{补}}=00000041H=65。排除选项A、D。x-y直接利用补码减法准则,[x]_{\text{补}}-[y]_{\text{补}}=[x]_{\text{补}}+[-y]_{\text{补}},-y的补码是连同符号位取反加1,最终减法变成加法,得出结果为FFFFFFF9EH。 30.B 逻辑移位:左移和右移空位都补0,且所有数字参与移动;补码算术移位:仍然是所有数字参与移动,右移空位补符号位,左移空位补0。根据该规则,轻松选取选项B。 31.A [x]_{\text{补}}-[y]_{\text{补}}=[x]_{\text{补}}+[-y]_{\text{补}},[-R2]_{\text{补}}=00000010H,很明显[R1]_{\text{补}}+[-R2]_{\text{补}}的最高位进位和符号位进位都是1(当最高位进位和符号位进位的值不相同时才产生溢出),可以判断溢出标志OF为0。同时,减法操作只需判断借位标志,R1大于R2,所以借位标志为0。 32.B ALU生成标志位时只负责计算,而不管运算对象是有符号数还是无符号数,CF=1表示当作无符号数运算时溢出,OF=1表示当作有符号数运算时溢出。当作有符号数时,x=10,y=-20,x-y=30,未超过32位有符号数范围,不溢出,OF=0。当作无符号数时,x^{\prime}=10,y^{\prime}=2^{32}-20(符号位读作数值位),x^{\prime}-y^{\prime}=30-2^{32},为负,超过32位无符号数范围,溢出,CF=1。 33.B 2^{15}=32768,i=32768+9=8000H+9H=8009H,32位有符号数i的机器数为0000 8009H。将32位有符号数i强制转换为16位有符号数si,直接保留机器数的末16位即可,因此si的机器数为8009H,真值为-2^{15}+9=-32759。将16位有符号数si强制转换为32位有符号数j,采用符号扩展(si 52 2027年计算机组成原理考研复习指导 的符号为 1,因此高位补 1),j 的机器数变为 FFFF 8009H,对应的真值为 -32759。 int i short si int j 机器数 0000 8009H 8009H FFFF 8009H 真值 32777 -32759 -32759 34.D 阵列乘法器中的所有部分积同时产生并组成一个阵列,运用多操作数相加就能得到最终的积,因此可在一个时钟周期内完成。用 ALU 和移位器实现的乘运算通常采用串行的乘法算法,需要多个时钟周期才能完成。当一个乘数是常数时,编译器可将乘运算优化为若干移位和加减运算指令。两个变量的乘运算可通过移位和加法等指令循环实现,选项 D 错误。 35.D 要求计算 x-y,即 [x]补 + [-y]补。首先求 [-y]补:对 [y]补按位取反得 1000 1010,再加 1,得 1000 1011=8BH。然后计算 [x]补 + [-y]补 = A3H + 8BH = 10100011 + 10001011=(1)0010 1110,忽略进位后,结果为 0010 1110=2EH,对应十进制数 46。判断溢出:参与运算的两个操作数符号位均为 1(负数),而结果符号位为 0(正数),表明发生了溢出,因此 OF=1。 二、综合应用题 01.【解答】 1)对于无符号数,所有二进制位均为数值位。乘以 2 和除以 2 运算,相当于无符号数的逻辑左移和逻辑右移。x 的真值为 2^{31}+2^{2}。R1 中的机器码逻辑右移一位(高位补 0)为 4000 0002H,相当于除以 2,所以 x/2 的真值为 2^{30}+2。R1 中的机器码逻辑左移一位(低位补 0)为 0000 0008H,相当于乘以 2,高位丢 1,结果溢出,2x 的真值为 2^{3}(溢出)。 2)对于有符号数(补码),最高位为符号位。乘以 2 和除以 2 运算,相当于补码的算术左移和算术右移。8000 0004H 对应二进制数的最高位为 1,即为负数,其真值为 -(2^{31}-2^{2})。R1 中的机器码算术右移一位(高位补 1)为 0000 0002H,相当于除以 2,x/2 的真值为 -(2^{30}-2)。R1 中的机器码算术左移一位(低位补 0)为 0000 0008H,相当于乘以 2,移位前后的符号位不同,表示溢出,2x 的真值为 8(溢出)。 02.【解答】 1)因为 x=-68=-(100 0100)2,则 [-68]补 =1011 1100=BCH;因 y=-80=-(101 0000)2,则 [-80]补 =1011 0000=B0H,所以寄存器 A 和 B 中的内容分别是 BCH、B0H。 2)[x+y]补 =[x]补 +[y]补 =1011 1100+1011 0000=(1)0110 1100=6CH,所以寄存器 C 中的内容是 6CH,其真值为 108。此时,溢出标志 OF 为 1,表示溢出,说明寄存器 C 中的内容不是正确结果;符号标志 SF 为 0,表示结果为正数(OF 为 1,说明 SF 也是错的)。 3)[x-y]补 =[x]补 +[-y]补 =1011 1100+0101 0000=(1)0000 1100=0CH,最高位前面的一位被丢弃(取模运算),结果为 12,所以寄存器 D 中的内容是 0CH,其真值为 12。此时,溢出标志 OF 为 0,表示不溢出,也就是说,寄存器 D 中的内容是正确的结果;符号标志 SF 为 0,表示结果为正数。 03.【解答】 1)因为 134=128+6=1000 0110B,所以 x 的机器数为 1000 0110B,因此 R1 的内容为 86H。 246=255-9=1111 0110B,所以 y 的机器数为 1111 0110B,x-y=1000 0110+0000 1010=(0)1001 0000,括号中为加法器的进位,因此 R5 的内容为 90H。x+y=1000 0110+1111 0110=(1)0111 1100,括号中为加法器的进位,因此 R6 的内容为 7CH。 2)m 的机器数与 x 的机器数相同,皆为 86H=1000 0110B,解释为有符号整数 m(用补码表示)时,其值为 -111 1010B=-122。m-n 的机器数与 x-y 的机器数相同,皆为 90H=1001 第2章 数据的表示和运算 53 0000B,解释为有符号整数k1(用补码表示)时,其值为-1110000B=-112。 3)能。n位加法器实现的是模2^{n}无符号整数加法运算。对于无符号整数a和b,a+b可以直接用加法器实现,而a-b可用a加-b的补数实现,即a-b=a+[-b]_{\text{补}}\left(\bmod 2^{n}\right),所以n位无符号整数加减运算都可在n位加法器中实现。 因为有符号整数用补码表示,补码加减运算公式为[a+b]_{\text{补}}=[a]_{\text{补}}+[b]_{\text{补}}\left(\bmod 2^{n}\right),[a-b]_{\text{补}}=[a]_{\text{补}}+[-b]_{\text{补}}\left(\bmod 2^{n}\right),所以n位有符号整数加减运算都可在n位加法器中实现。 4)有符号整数加减运算的溢出判断规则为:若加法器的两个输入端(加法)的符号相同,且不同于输出端(和)的符号,则结果溢出,或加法器完成加法操作时,若次高位(最高数位)的进位和最高位(符号位)的进位不同,则结果溢出。 最后一条语句执行时会发生溢出。因为10000110+11110110=(1)01111100,括号中为加法器的进位,根据上述溢出判断规则可知结果溢出。或者,因为两个有符号整数均为负数,它们相加之后,结果小于8位二进制所能表示的最小负数。 04.【解答】 1)乘法运算可以通过加法和移位来实现。编译器可以将乘法运算转换为一个循环代码段,在循环代码段中通过比较、加法和移位等指令实现乘法运算。 2)控制逻辑的作用是控制循环次数,控制加法和移位操作。 3)a最长,c最短。对于a,需要用循环代码段实现乘法操作,因此需要反复执行很多条指令,而每条指令都需要取指令、译码、取数、执行并保存结果,所以执行时间很长;对于b和c,都只需用一条乘法指令实现乘法操作,不过b中的乘法指令需要多个时钟周期才能完成,而c中的乘法指令可在一个时钟周期内完成,所以c的执行时间最短。 4)当n=32,x=2^{31}-1,y=2时,有符号整数和无符号整数乘法指令得到的64位乘积都是00000000FFFFFFFEH。int型的表示范围为[-2^{31},2^{31}-1],所以函数imul()的结果溢出;unsigned int型的表示范围为[0,2^{32}-1],所以函数umul()的结果不溢出。对于无符号整数乘法,若乘积高n位全为0,即使低n位全为1也正好是2^{32}-1,不溢出,否则溢出。注意,无论是无符号数还是有符号数,用2n位来表示两个n位整数的相乘结果都不会溢出,因为2n位可以完整地存储两个n位整数的乘积。但是,若只用低n位来表示结果,则可能溢出。因此,要保证低n位转换为的真值与2n位转换为的真值相等才算是不溢出。对于无符号数,只要高n位全为0,就不会溢出,因为高n位在转换为真值后不会影响低n位的值。对于有符号数,要考虑符号位的影响。当结果是正数时,符号位为0,要求高n位也全为0,且低n位的最高位也为0(否则正数变负数)。当结果是负数时,符号位为1,要求高n位也全为1,且低n位的最高位也为1(否则负数变正数)。因此,在有符号数的情况下,高n+1位相同表示不溢出。 2.3 浮点数的表示与运算 浮点数表示法通过将比例因子嵌入数据中,使小数点位置可根据需要浮动。这样,在有限位数下,既能扩大数值的表示范围,又能保持较高的有效精度。例如,用定点数表示电子质量(9×10^{-28}g)或太阳质量(2×10^{33}g)极为不便,而浮点数则能高效处理此类极大或极小的数值。 通常,浮点数表示为 N=(-1)^{S}×M×R^{E} 54 2027年计算机组成原理考研复习指导 其中,S(取值0或1)决定浮点数的符号;M是一个非负的定点小数,称为尾数,通常用原码表示;E是一个定点整数,称为阶码(或指数),通常采用偏置表示(一种移码形式)。R是基数(通常隐含约定为2、4或16)。可见,浮点数由符号、尾数和阶码三部分组成。 在IEEE 754浮点数标准广泛使用之前,不同计算机所用的浮点数表示格式各不相同。图2.13展示了一种典型的32位短浮点数格式示例。 符号 1 7 8 31 阶码 尾数 图2.13 一种典型的32位浮点数格式示例 其中,第0位为符号S;第1~7位为阶码E,采用偏置值为64的移码表示;第8~31位为24位尾数M,以二进制原码小数表示;基数R为2。在该格式中,阶码的值决定了小数点的实际位置;阶码的位数决定了浮点数的表示范围;尾数的位数则决定了数值的精度。 2.3.1 IEEE 754标准的浮点数 1.IEEE 754标准的浮点数格式 考点追踪 IEEE 754单精度数大小的比较(2014) 现代系统普遍采用IEEE 754浮点数标准。该标准定义了两种常用格式:32位单精度浮点数(float型)和64位双精度浮点数(double型),其基数隐含为2,其格式如图2.14所示。 符号 8位 23位 阶码 尾数 (a)32位单精度格式 1位 11位 52位 符号 阶码 尾数 (b)64位双精度格式 图2.14 IEEE 754标准浮点数的格式 32位单精度格式包含1位符号s、8位阶码e和23位尾数f;64位双精度格式包含1位符号s、11位阶码e和52位尾数f。基数隐含为2;尾数用原码表示。对于规格化的二进制浮点数,尾数的最高位恒为1。为提升精度,IEEE 754不显式存储该位,而是将其隐含在小数点之前,称为隐藏位。因此,单精度格式的23位尾数实际提供了24位有效数字,双精度格式的52位尾数实际提供了53位有效数字。例如,(12)_{10}=(1100)_{2},规格化后为1.1×2^{3}。其中,小数点前的“1”不实际存储,尾数f仅保存小数部分“100…0”,而阶码保存的是指数3的编码值。 IEEE 754标准的阶码采用移码表示,但偏置值并不是通常n位移码所用的2^{n-1},而是2^{n-1}-1。因此,单精度和双精度格式的偏置值分别为127和1023。上例中,指数真值为3,因此在单精度格式中,阶码为127+3=130(82H);在双精度格式中,阶码为1023+3=1026(402H)。 IEEE 754标准的规格化单精度浮点数的真值为 (-1)^{s}×1.f×2^{e-127} 规格化双精度浮点数的真值为 (-1)^{s}×1.f×2^{e-1023} 其中,规格化单精度浮点数的阶码e的取值范围为1~254(8位,全0和全1保留用于特殊值);规格化双精度浮点数的阶码e的取值范围为1~2046(11位,保留用途相同)。 第2章 数据的表示和运算 55 2. IEEE 754格式浮点数的表示范围 考点追踪 IEEE 754浮点数的表示范围和有效位 (2017、2018、2024) IEEE 754规格化浮点数的表示范围见表2.2. 表2.2 IEEE 754规格化浮点数的表示范围 格 式 最 小 值 最 大 值 单精度 e=1,f=01.0×2¹⁻¹²⁷=2⁻¹²⁶ e=254,f=.111\cdots,111..1×2²⁵⁴⁻¹²⁷=2¹²⁷×(2-2⁻²³) 双精度 e=1,f=01.0×2¹⁻¹⁰²³=2⁻¹⁰²² e=2046,f=.1111..,1.11..1×2²⁰⁴⁶⁻¹⁰²³=2¹⁰²³×(2-2⁻⁵²) 当浮点运算结果的绝对值超过最大规格化数时,发生上溢(也称溢出),可分为: ·正上溢:若结果为正且大于最大规格化正数。 ● 负上溢:若结果为负且小于最小规格化负数(绝对值过大)。 IEEE 754对上溢的处理规则:①将结果设为+∞或-∞;②置位浮点溢出异常标志,IEEE 754规定,默认情况下不触发异常中断,程序继续执行,除非显式开启此类异常响应。 当运算结果的绝对值小于最小规格化正数但不为零时,发生下溢,可分为: ●正下溢:若结果为正,且处在0到最小规格化正数之间。 ●负下溢:若结果为负,且处在最大规格化负数到0之间。 对下溢的处理采用渐进下溢机制:①若结果落在非规格化数可表示范围内,则以非规格化形式存储,保留部分有效精度;②若结果过于接近零(舍入后为零),则存储为+0或-0,并置位浮点下溢异常标志。同样,默认不响应下溢异常,程序继续运行,除非显式启用异常处理。 IEEE 754标准的单精度浮点数的表示范围如图2.15所示。 - (2 - 2^{ - 2 3}) × 2^{1 2 7} -1.0×2⁻¹26 + 1 . 0 × 2^{ - 1 2 6} + (2 - 2^{ - 2 3}) × 2^{1 2 7} 零 可表示的负数 可表示的正数 负上溢 规格化浮点数 负下溢 正下溢 规格化浮点数 正上溢 非规格 非规格 数轴 化负数 化正数 -1.0×2⁻¹⁴⁹ + 1 . 0 × 2^{ - 1 4 9} 图2.15 IEEE 754标准的单精度浮点数的表示范围 3. 几种特殊的IEEE 754浮点数 考点追踪 IEEE 754标准中的特殊浮点数 (2017、2023) 在IEEE 754标准中,当阶码全为0或全为1时,浮点数具有特殊含义,如表2.3所示。 表2.3 阶码全为0或全为1时IEEE754浮点数的解释 值的类型 单精度(32位) 双精度(64位) 符号 阶码 尾数 值 符号 阶码 尾数 值 正零 0 0 0 0 0 0 0 0 负零 1 0 0 -0 1 0 0 -0 正无穷大 0 255(全1) 0 ∞ 0 2047(全1) 0 00 负无穷大 1 255(全1) 0 -∞ 1 2047(全1) 0 -∞ 无定义数(非数) 0或1 255(全1) f≠0 NaN 0或1 2047(全1) f≠0 NaN 非规格化正数 0 0 f≠0 2⁻¹²⁶(0. f) 0 0 f≠0 2⁻¹⁰²²(0. f) 非规格化负数 1 0 f≠0 -2⁻¹²⁶(0. f) 1 0 f≠0 -2⁻¹⁰²²(0. f) 56 2027年计算机组成原理考研复习指导 1)全0阶码全0尾数:+0/-0.符号s决定其正负,通常情况下+0和-0是等效的。 2)全1阶码全0尾数:+∞/-∞。+∞在数值上大于所有有限数,-∞则小于所有有限数。引入无穷大数的目的是,使程序在溢出等异常情况下仍能继续执行。 3)全1阶码非0尾数:NaN (Not a Number)。表示一个没有定义的数,称为非数。 4)全0阶码非0尾数:非规格化数。非规格化数的特点是阶码为全0,不使用隐藏位,尾数字段不全为0。因此,单精度和双精度浮点数的指数分别为-126和-1022.非规格化数用于实现渐进下溢,填补0与最小规格化数之间的数值间隙。 考点追踪 实数与IEEE 754浮点数的相互转换(2011、2013、2020、2022、2023、2025) 【例2.5】将十进制数-8.25转换为IEEE 754单精度浮点数格式表示。 解: IEEE 754单精度浮点数的偏置值是127;尾数最高位的“1”是被隐藏的。 先将-8.25转换为二进制,即-1000.01= -1.000 01×2³, 尾数部分取小数点后的23位(00001后补0至23位);再计算阶码E,E-127=3, 因此E=130, 转换为二进制为10000010. IEEE 754单精度浮点数格式:符号(1位)+阶码(8位)+尾数(23位),即为 1;1000 0010;0000 1000 00000000000000 因此,其单精度浮点数格式表示为11000001000001000000 0000 000000000=C1040000H. 【例2.6】求IEEE 754单精度浮点数C640 0000H的值是多少。 解: 先将C6400000H按二进制展开为 110001100100 0000 000000000000000 按IEEE 754单精度浮点数格式划分: 符号 阶码 尾数 1 1000 1100 1000000 0000 000000000000 因此,符号=1表示负数;阶码真值为1000 1100-0111 1111=(0000 1101)₂=13;尾数真值为1 + (0 . 1)_{2} = 1 . 5(注意,尾数含隐藏位1)。因此,该单精度浮点数的值为- 1 . 5 × 2^{1 3}。 2.3.2浮点数的加减运算 浮点数运算的特点是阶码与尾数分开处理,浮点数加减运算分为以下几个步骤。 考点追踪 float型能否通过左移实现乘以2运算(2017);浮点数的加减运算(2009) 1.对阶 对阶的目的是使两个操作数的小数点位置对齐,即令它们的阶码相等,以便尾数可以直接相加减。对阶的原则是:小阶向大阶看齐,即将阶码较小的数的尾数右移,右移位数等于两阶码差的绝对值。对于IEEE 754标准的浮点数,对阶时需要进行移码减法运算,以求得阶码差。尾数右移时,仅移动数值位,符号位不参与移位;对于规格化数,隐藏位1会随尾数右移而进入小数部分,空出的高位补0。为保证运算精度,移出的低位不应丢弃,而应保留并参与后续尾数运算。 注 意 若采用大阶向小阶看齐,则需将尾数左移,导致最高有效位被移出,造成不可逆的精度错误。 第2章 数据的表示和运算 57 2.尾数加减 由于IEEE 754标准采用定点原码小数表示尾数,因此尾数加减运算实质上是定点原码小数的加减运算,应根据相应的规则执行。对于规格化数,在运算前还需要将隐藏位还原到尾数部分,形成完整的1. f形式。此外,对阶过程中为保持精度而保留的附加位也要参与尾数加减运算。 3.尾数规格化 为在浮点运算中最大限度保留有效数字,需要对运算结果进行规格化处理。所谓规格化,是指通过调整尾数与阶码,使浮点数的尾数满足最高有效位为1的形式。 IEEE 754规格化尾数的形式为1.×…×。尾数相加减后可能出现两类非规格化结果: 1.×…×+1.×…×=1×.×…× 1.×…×-1.×…×=0.0…01×…× 1)右规:当结果为1×.×...×时,需要进行右规。尾数每右移一位,阶码加1。尾数右移时,最高位1被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。 2)左规:当结果为0.0…01×…×时,需要进行左规。尾数每左移一位,阶码减1。可能需要左规多次,直到将第一位1移至小数点左边。 注 意 ① 左规一次相当于乘以2,右规一次相当于除以2;②需要右规时,只需进行一次。 4.舍入 在对阶和右规过程中,尾数右移可能导致低位丢失。为保证精度,移出的低位通常被保留用于中间计算。最终结果需通过舍入处理,还原为标准的IEEE 754格式。 为此,IEEE 754引入三个辅助位以指导精确舍入。 1)保护位:紧邻尾数最低有效位之后的第一位,用于初步判断舍入方向。 2)舍入位:位于保护位之后,与保护位和粘滞位共同构成完整的舍入信息。 3)粘滞位:只要舍入位之后被移出的位中存在至少一个1,粘滞位就置为1,否则为0. IEEE 754定义了四种可选的舍入模式。 1)就近舍入(默认方式):选择最接近真实值的可表示数。若真实值恰好位于两个可表示数的正中间,则选择尾数最低有效位为0的那个(偶数)。具体规则:①若保护位=0,直接舍去;②若保护位=1且(舍入位=1或粘滞位=1),则尾数加1;③若保护位=1、舍入位=0、粘滞位=0,则在尾数末位为奇数时向其加1,以符合向偶数舍入的要求。 例如,运算后得到浮点数的临时尾数M₁,舍入过程如下:M₁ M₁=1.10110011 11001100 1101010 101 注意,下划线部分为保留的23位尾数,其后依次为保护位、舍入位、粘滞位。 由于保护位=1、舍入位=0、粘滞位=1,结果属于非中间值,需要向尾数加1。加1后的23位尾数为10110011 11001100 1101 011. 若运算后得到临时尾数M₂,则舍入过程如下: M₂=1.10110011 11001100 1101010 100 由于保护位=1、舍入位=0、粘滞位=0,结果恰好位于两个可表示数的正中间。此时尾数最低有效位为偶数,无须加1。最终的23位尾数保持为10110011 1100 11001101010. 2)正向舍入:朝数轴+∞方向舍入,即选择数值更大的可表示数。 3)负向舍入:朝数轴-∞方向舍入,即选择数值更小的可表示数。 58 2027年计算机组成原理考研复习指导 4)截断法:直接截取所需位数,丢弃后面的所有位,实现最为简单。对正数或负数来说,都是选择更接近原点的那个可表示数,也称为朝原点舍入。 5.溢出判断 考点追踪 浮点数运算时的溢出判断 (2015) 在尾数规格化或舍入过程中,可能对阶码进行加减操作,因此需要判断指数是否溢出。在IEEE 754中,浮点数的溢出由阶码是否超出可表示范围决定;尾数溢出可通过右规修正,而真正的溢出仅发生在阶码上溢或下溢时。 1)上溢判断。尾数相加后若结果≥2,或舍入时尾数末位加 1 引发进位(如1.111…+1=10.000…),则均需右规:尾数右移一位,阶码加1。若原阶码已为最大正规格化值(单精度阶码字段为11111110,对应真值+127), 加1后变为11111111(该编码保留用于表示无穷大或NaN),则视为指数上溢,通常会引发异常。 2)下溢判断。左规时尾数左移,阶码减1。若阶码真值减至低于最小正规格化值(单精度-126,双精度-1022),则进入非规格化数范围(阶码字段为0)。若结果进一步小于最小可表示非规格化数(如2⁻¹⁴⁹或2⁻¹⁰⁷⁴),则视为指数下溢,通常将结果置为机器零。 【例2.7】设x和y为float型变量,x=10.5, y=-120.625, 请给出x+y的计算过程。 解: x = 1 0 . 5 = (1 0 1 0 . 1)_{2} = (1 . 0 1 0 1)_{2} × 2^{3}。其IEEE 754单精度:符号位为0;阶码为3+127=130, 即10000010; 机器数(注意隐含尾数最高位)为0;10000010;010 100000000000 00000000. y = - 1 2 0 . 6 2 5 = - (1 1 1 1 0 0 0 . 1 0 1)_{2} = - (1 . 1 1 1 0 0 0 1 0 1)_{2} × 2^{6}。其IEEE 754单精度:符号位为1,阶码为6+127=133, 即10000101; 机器数为1;10000101;1110001010000000000000. 1)对阶。求阶差。E_{x} - E_{y} = - 3 。故将x的尾数右移3位,阶码调整为Ey=133.对阶后,x的尾数变为0.0010 101000000000000000000000000(含保留的附加位),此时无隐藏位。 2)尾数相加。0.0010 101000000000 00000000000000000+(-1.11100010 1000 0000 00000)=-1.1011 1000 1000 0000 000000 00000(注意,附加位参与运算,但不会存储)。 3)规格化。尾数相加结果- 1 . 1 0 1 1 1 0 0 0 1 0 \cdots × 2^{6} ,已是规格化形式。 4)舍入。单精度尾数保留23位,附加位全为0,按就近舍入规则,直接截断。 因此, x+y的机器数为1;1000 0101;1011 1000 1000 0000 0000000. 其真值为- 2.3.3 C语言中的浮点数类型 考点追踪 不同类型数据转换后数值的变化(2010) C语言中的float型和double型分别对应IEEE 754单精度和双精度浮点数。long double型通常对应扩展双精度格式,其长度和格式依赖于编译器与目标平台。在C语言中,表达式中的赋值、运算或比较操作会触发自动类型转换,常见的转换序列为char→int→long→double 和 float→double,这些转换通常由范围和精度较低的类型向更高者进行,一般不会丢失信息。 当不同类型的数据混合运算时,遵循类型提升原则:较低类型自动转换为较高类型。例如,long与int运算时,先将int转换为long,然后进行运算,结果为long;float与double运算时,先将float转换为double,结果为double.这类由编译器自动完成的转换称为隐式类型转换。 考点追踪 int和float型的精度和范围分析(2017) 1)int转float时,虽然不会发生溢出,但由于float尾数(含隐藏位)仅24位有效,而int 第2章数据的表示和运算 59 为32位,当整数值的二进制有效位超过24位时,需做舍入处理,导致精度损失。 2) int或float转double时,因double的有效位更多,通常能精确表示原值。 3) double转float时,一方面float的表示范围较小,大数值转换时可能发生溢出;另一方面float的尾数有效位变少,高精度数转换时会发生舍入误差。 4) float或double转int时,由于int没有小数部分,小数部分被直接丢弃(向零截断);同时,若浮点数值超出int的表示范围,则会发生整数溢出。 不同数据类型之间的转换常隐藏不易察觉的精度损失或溢出风险,编程时需格外谨慎。 2.3.4数据的宽度和存储 1.数据的宽度和单位 在计算机中,比特(bit,也称位,符号为b)是最小的信息单位,表示一个二进制位(0或1);字节(byte,符号为B)是基本的存储和寻址单位,1字节=8比特。随着信息规模增大,常在B(字节)或b(位)前添加前缀以表示更大的容量,如KB、MB、GB等。在传统计算机系统中,这些前缀通常按2的幂定义,如1KB=2¹⁰B=1024B。 此外,字(word)也是常用的数据组织单位。它是由体系结构定义的逻辑单位,通常用于表示整数、地址等基本数据类型的宽度,其长度因架构而异,常见的有2、4或8字节。 与字不同,字长(也称机器字长)指CPU内部整数运算的数据通路的宽度,通常等于通用寄存器的宽度。字长反映计算机一次能处理的整数数据的位数,是衡量机器性能的重要指标。日常所说的“32位机”或“64位机”,其中的32或64即指字长。例如,在Intel x86架构中,自80386起字长为32位(32位机),但其体系结构仍将16位定义为一个字,32位称为双字。这表明:字是架构层面的约定,而字长体现的是硬件的实际处理能力。 2.数据的“大端方式”和“小端方式”存储 在存储数据时,数据从低位到高位可以按从左到右排列,也可以按从右到左排列。因此,不宜用最左或最右来表征数据的最高位或最低位,通常使用最低有效字节(LSB)和最高有效字节(MSB)来分别表示数据的最低位和最高位。例如,在32位计算机中,一个int型变量i的机器数为01234567H,其最高有效字节MSB=01H,最低有效字节LSB=67H。 考点追踪 数据的大小端存储(2016、2018、2019、2024、2025) 现代计算机普遍采用字节编址,即每个地址对应1字节。不同类型的数据占用不同字节数(如int和float占4字节,double占8字节),而程序中每个变量仅分配一个起始地址。假设变量i的地址为0800H,那么其4个字节01H、23H、45H、67H将占据连续的4个内存单元。这些字节在内存中的排列方式分为两种(见图2.16): 大端方式 0800H 0801H 0802H 0803H … 01H 23H 45H 67H 小端方式 … 67H 45H 23H 01H 图2.16采用大端方式和小端方式存储数据 考点追踪 根据存放顺序判断大小端方式(2019、2023) 1)大端方式(big endian):MSB存储在低地址,LSB存储在高地址,字节顺序与数值的标准十六进制书写顺序一致。 60 2027年计算机组成原理考研复习指导 2)小端方式 (little endian):LSB存储在低地址,MSB存储在高地址,字节顺序与标准书写顺序相反。 在分析机器代码时,需特别注意字节顺序。例如,以下是由反汇编器生成的一行代码: 4004d3: 01 05 64 94 04 08 add eax, 0x08049464 其中,4004d3是指令地址, 010564940408是指令的机器码,add eax,0x08049464是其汇编形式.指令的第二个操作数是立即数0x08049464,其在内存中按地址递增顺序存储为:64H、94H、04H、08H.由于低地址存放的是LSB(64H) ,高地址存放的是MSB(08H) ,符合小端方式的特征。将这4个字节按小端规则重组,即可得到正确的立即数0x08049464。因此,在阅读小端机器代码时,需要将连续字节按逆序组合才能还原其逻辑数值。 3.数据按“边界对齐”方式存储 在字长为32位的系统中,边界对齐要求数据的存储地址是其对齐值(通常等于该类型大小,单位:字节)的整数倍:字节可位于任意地址,半字地址须为2的倍数,字地址须为4的倍数。满足此条件时,CPU可通过一次访存读取完整数据;否则,若数据跨越两个存储单元,则需两次访存并拼接字节,显著降低效率。为满足对齐要求,编译器会在必要时填充空白字节。这种“以空间换时间”的策略虽略微增加内存占用,但能大幅提升访问速度。 例如,数据序列“字节1、字节2、字节3、半字1、半字2、半字3、字1”按边界对齐与非对齐方式存储的格式分别如图2.17和图2.18所示。 字节1 字节2 字节3 填充 半字1 半字2 半字3 填充 字1 字节1 字节2 字节3 半字1-1 半字1-2 半字2 半字3-1 半字3-2 字1-1 字1-2 图2.17 按边界对齐方式存储 图2.18 按边界不对齐方式存储 考点追踪 结构体的小端、边界对齐存储(2012、2020) C语言中,struct型的内存布局遵循以下对齐规则:①每个成员的起始地址必须是其对齐值的整数倍(例如:char为1,short为2,int为4);②整个结构体的大小必须是其最大成员对齐值的整数倍(不足则在尾部填充)。这确保了每个结构体成员的起始地址均满足对齐要求。 先看两个例子(基于32位x86环境,GCC编译器): struct A{ struct B{ int a; char b; char b; int a; short c; short c; } } 结果却是:sizeof(A)=8, sizeof(B)=12. 设B从地址0x0000开始,成员b的对齐值是1,其存放地址符合0x0000%1=0;成员a的对齐值是4, 需对齐到4字节边界,故起始于0x0004, 占据0x0004~0x0007; 成员c的对齐值是2,起始于0x0008,占据0x0008~0x0009.此外,结构体长度必须是最大对齐值(4)的整数倍,当前大小10字节,需填充至12字节 (0x000A~0x000B) . 设A也从地址0x0000开始,成员a的对齐值是4,存放在0x0000~0x0003;成员b的对齐值是1,存放在0x0004;成员c的对齐值是2,为满足“起始地址%对齐值=0”的条件,只能存放在0x0006~0x0007,总大小为8字节,无须尾部填充。 精简指令集计算机(RISC)普遍采用边界对齐,以支持高效的指令流水线。 第2章数据的表示和运算 61 2.3.5 本节习题精选 一、单项选择题 01.在C语言的不同类型的数据混合运算中,要先转换为同一类型后进行运算。设一表达式中包含有int型、long型、char型和double型的变量与数据,则表达式最后的运算结果是(),这4种类型数据的转换规律是()。 A. long, int→char→double→long B. long, char→int→long→double C. double, char→int→long→double D. double, char→int→double→long 02.长度相同但格式不同的两种浮点数,假设前者阶码长、尾数短,后者阶码短、尾数长,其他规定均相同,则它们可表示的数的范围和精度为()。 A.两者可表示的数的范围和精度相同 B.前者可表示的数的范围大但精度低 C.后者可表示的数的范围大且精度高 D.前者可表示的数的范围大且精度高 03.浮点数的IEEE 754标准对尾数编码采用的是()。 A.原码 B.反码 C.补码 D.移码 04.在IEEE 754标准规定的64位浮点数格式中,符号位为1位,阶码为11位,尾数为52位,则它所能表示的最小规格化负数为()。 A.-(2-2⁵²)×2-1023 B.-(2-2-5²)×2+1023 C.-1×2-1024 D.-(1-2-52)×2+2047 05.按照IEEE 754标准规定的32位单精度浮点数41A4C000H对应的十进制数是()。 A.4.59375 B.-20.59375 C.-4.59375 D.20.59375 06.在浮点数编码表示中,()在机器数中不出现,是隐含的。 A.阶码 B.符号 C.尾数 D.基数 07.若某单精度浮点数、某原码、某补码、某移码的32位机器数均为0xF0000000,则这些数从大到小的顺序是()。 A.浮原补移 B.浮移补原 C.移原补浮 D.移补原浮 08.采用规格化的浮点数最主要是为了()。 A.增加数据的表示范围 B.方便浮点运算 C.防止运算时数据溢出 D.增加数据的表示精度 09.设x是采用IEEE 754标准表示的32位单精度浮点数,下列说法中正确的是()。 Ⅰ.当|x|<1.0×2-126时,x将被置为机器零 Ⅱ.当|x|>1.0×2¹²⁷时,将发生溢出 Ⅲ.x所能表示的最小非规格化正数与最大非规格化负数的绝对值相等 Ⅳ.x可表示的最大正数与最小负数的绝对值相等 A. I,II,III,IV B. I,II C. II,III,IV D. III,IV 10.在浮点运算中,下溢指的是()。 A.运算结果的绝对值小于机器所能表示的最小绝对值 B.运算的结果小于机器所能表示的最小负数 C.运算的结果小于机器所能表示的最小正数 D.运算结果的最低有效位产生的错误 11.判断浮点数运算是否溢出,取决于()。 A.尾数是否上溢 B.尾数是否下溢 C.阶码是否上溢 D.阶码是否下溢 12.假定采用IEEE 754标准中的单精度浮点数格式表示一个数为45100000H,则该数的值是()。 62 2027年计算机组成原理考研复习指导 A. (+1.125)_{10}×2^{10} B. (+1.125)_{10}×2^{11} C. (+0.125)_{10}×2^{11} D. (+0.125)_{10}×2^{10} 13.已知 float 型采用 IEEE 754 单精度浮点数格式,若 x、y 为 float 型变量,且x=-126,y=15.75,则执行语句x=x+y时,在浮点运算单元中进行对阶操作后的结果是( )。 A. x 不变,y 为 010000101,0.001111110... B. x 不变,y 为 010000110,0.001111110... C. y 不变,x 为 110000101,0.001111110... D. y 不变,x 为 110000110,0.001111110... 14.假设 x 和 y 均是 float 型变量,x 的真值为 1,y 的真值为 0.1。已知 0.1 的二进制表示为无限循环小数 0.00011[0011]...(重复因子为 0011),某计算机采用 IEEE 754 单精度格式及就近舍入方式,则计算x+y的结果用十六进制机器数表示为( )。 A. 3F80 0000 B. 3F8C CCCD C. 3F8C CCCC D. 3F80 000C 15.在 IEEE 754 标准浮点格式中,非规格化浮点数表示为( )。 A. 阶码为 0,尾数为任意非 0 的二进制数 B. 阶码为 255,尾数全为 0 C. 阶码为 255,尾数为任意非 0 的二进制数 D. 阶码为 0,尾数全为 0 16.在 IEEE 754 单精度浮点数加减运算的对阶阶段,若需将某操作数的尾数右移以对齐阶码,则关于其隐含的前导“1”,以下说法正确的是( )。 A. 隐含的“1”始终保留在最高位,在右移过程中不会被移出 B. 隐含的“1”参与右移,但为保持规格化形式,移位后仍重置为 1 C. 对阶移位前,需先将隐含的“1”恢复到尾数高位,再整体右移 D. 非规格化数也包含隐含的“1”,因此同样需要恢复后再移位 17.在 IEEE 754 单精度浮点数加减运算中,若两个操作数阶码之差的绝对值为 \Delta E,当其大于或等于( )时,阶码较小的操作数对结果无影响,结果直接取阶码较大的操作数(假设采用就近舍入的方式)。 A. 24 B. 25 C. 126 D. 128 18.下列关于机器字长的叙述中,错误的是( )。 A. 机器字长是指 CPU 中定点运算数据通路的宽度 B. 机器字长通常与 CPU 通用寄存器的位数一致 C. 机器字长决定了定点数的表示范围和精度 D. 机器字长对计算机硬件造价没有影响 19.计算机中的信息按边界对齐方式存储的含义是( )。 A. 信息的字节长度必须是整数 B. 信息单元的字节长度必须是整数 C. 信息单元的存储地址必须是整数 D. 信息单元的存储地址是其字节长度的整数倍 20.假设已定义三个 int 型变量 x、y 和 z,sizeof(int)=4,double 型采用 IEEE 754 双精度浮点数格式,变量 dx、dy 和 dz 的声明和初始化如下: double dx =(double)x; double dy =(double)y; double dz =(double)z; 则下列关系表达式中永远为真的是( )。 I. dx+dy==(double)(x+y) II. (dx+dy)+dz==dx+(dy+dz) 第2章数据的表示和运算 63 A. I和II B.仅I C.仅II D.无正确项 21.在按字节编址的计算机中,采用小端方式存储数据,某静态二维数组b的声明如下: static short b[2][4]={{2,9,-1,5},{3,1,-6,2}}; 若b的首地址为0x8049820,采用按行优先存储,地址0x804982c中的内容是()。 A.FAH B.FFH C.00H D.05H 22.在按字节编址的计算机中,数据在存储器中以小端方式存放。假定int型变量i的地址为08000000H,i的机器数为01234567H,地址08000000H单元的内容是()。 A.01H B.23H C.45H D.67H 23.在按字节编址的32位计算机中,按边界对齐方式为以下结构型变量x分配存储空间: struct cont info{ char id; unsigned post; char phone; }x; 若x的首地址为0x8049820,则成员变量phone的起始地址为()。 A.0x8049828 B.0x8049826 C.0x8049825 D.0x8049822 24.假定变量i、f的数据类型分别是int、float。已知i=12345,f=1.2345×2³,则在一个32位机器中执行下列表达式时,结果为“假”的是()。 A.i==(int)(double)i B.f==(float)(double)f C.i==(int)(float)i D.f==(float)(int)f 25.有以下C语言代码段: int m=13; float a=12.6,x; x=m/2+a/2; printf("%f\n",x); 执行上述代码后,输出的x值为()。 A.12.000000 B.12.300000 C.12.800000 D.12 26.【2009统考真题】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判断溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5和7(均含2位符号位)。若有两个数X=2⁷×29/32和Y=2⁵×5/8,则用浮点加法计算X+Y的最终结果是()。 A.001111100000 B.001110100000 C.010000010001 D.发生溢出 27.【2010统考真题】假定变量i、f和d的数据类型分别为int、float和double(int型用补码表示,float型和double型分别用IEEE 754单精度和双精度浮点数格式表示),已知i=785、f=1.5678E3、d=1.5E100,若在32位机器中执行下列关系表达式,则结果为“真”的是()。 I.i==(int)(float)i II.f==(float)(int)f III.f==(float)(double)f IV.(d+f)-d=f A.仅I和II B.仅I和III C.仅II和III D.仅III和IV 28.【2011统考真题】float型数据通常用IEEE 754单精度格式表示。若编译器将float型变量x分配在一个32位浮点寄存器FR1中,且x=-8.25,则FR1的内容是()。 A.C1040000H B.C2420000H C.C1840000H D.C1C20000H 29.【2012统考真题】float型(IEEE 754单精度浮点数格式)能表示的最大正整数是()。 A.2¹²⁶-2¹⁰³ B.2¹²⁷-2¹⁰⁴ C.2¹²⁷-2¹⁰³ D.2¹²⁸-2¹⁰⁴ 30.【2012统考真题】某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定int型和short型长度分别为32位和16位,并且数据按边界对齐存储。某C语言程序 64 2027年计算机组成原理考研复习指导 段如下: struct{ int a; char b; short c; } record; record.a = 273; 若 record 变量的首地址为 0xC008,地址 0xC008 中的内容及 record.c 的地址分别为( )。 A. 0x00, 0xC00D B. 0x00, 0xC00E C. 0x11, 0xC00D D. 0x11, 0xC00E 31.【2013 统考真题】某数采用 IEEE 754 单精度浮点数格式表示为 C640 0000H,则该数的值是( )。 A. -1.5×2^{13} B. -1.5×2^{12} C. -0.5×2^{13} D. -0.5×2^{12} 32.【2014 统考真题】float 型数据常用 IEEE 754 单精度浮点格式表示。假设两个 float 型变量 x 和 y 分别存放在 32 位寄存器f1 和 f2中,若(f1)=CC90 0000H,(f2)=B0C0 0000H,则 x 和 y 之间的关系为( )。 A. x < y 且符号相同 B. x < y 且符号不同 C. x>y 且符号相同 D. x>y 且符号不同 33.【2015 统考真题】下列有关浮点数加减运算的叙述中,正确的是( )。 I. 对阶操作不会引起阶码上溢或下溢 II. 右规和尾数舍入都可能引起阶码上溢 III. 左规时可能引起阶码下溢 IV. 尾数溢出时结果不一定溢出 A. 仅II、III B. 仅I、II、IV C. 仅I、III、IV D. I、II、III、IV 34.【2016 统考真题】某计算机字长为 32 位,按字节编址,采用小端方式存放数据。假定有一个 double 型变量,其机器数表示为 1122 3344 5566 7788H,存放在以 0000 8040H 开始的连续存储单元中,则存储单元 0000 8046H 中存放的是( )。 A. 22H B. 33H C. 77H D. 66H 35.【2018 统考真题】IEEE 754 单精度浮点格式表示的数中,最小的规格化正数是( )。 A. 1.0×2^{-126} B. 1.0×2^{-127} C. 1.0×2^{-128} D. 1.0×2^{-149} 36.【2018 统考真题】某 32 位计算机按字节编址,采用小端方式。若语句“int i=0;”对应指令的机器代码为“C7 45 FC 00 00 00 00”,则语句“int i=-64;”对应指令的机器代码是( )。 A. C7 45 FC C0 FF FF FF B. C7 45 FC 0C FF FF FF C. C7 45 FC FF FF FF C0 D. C7 45 FC FF FF FF 0C 37.【2020 统考真题】在按字节编址、采用小端方式的 32 位计算机中,按边界对齐方式为以下 C 语言结构型变量 a 分配存储空间: struct record{ short x1; int x2; } a; 若 a 的首地址为 2020 FE00H,a 的成员变量x2的机器数为 1234 0000H,则其中 34H 所在存储单元的地址是( )。 A. 2020 FE03H B. 2020 FE04H C. 2020 FE05H D. 2020 FE06H 38.【2020 统考真题】已知有符号整数用补码表示,float 型数据用 IEEE 754 标准表示,假定变量 x 的类型只可能是 int 或 float,当 x 的机器数为 C800 0000H 时,x 的值可能是( )。 A. -7×2^{27} B. -2^{16} C. 2^{17} D. 25×2^{27} 第2章数据的表示和运算 65 39.【2021统考真题】下列数值中,不能用IEEE 754浮点格式精确表示的是()。 A. 1.2 B. 1.25 C. 2.0 D. 2.5 40.【2022统考真题】-0.4375和IEEE 754单精度浮点数表示为()。 A. BEE00000H B. BF600000H C. BF700000H D. C0E00000H 41.【2023统考真题】若short型变量x=-8190,则x的机器数是()。 A. E002H B. E001H C. 9FFFH D. 9FFEH 42.【2023统考真题】已知float型变量用IEEE 754单精度浮点数格式表示。若float型变量x的机器数为80200000H,则x的值是()。 A. -2-128 B. -1.01×2-127 C. -1.01×2-126 D. 非数(NaN) 43.【2024统考真题】某科学实验中,需要使用大量的整型参数,为了在保证表数精度的基础上提高运算速度,需要选择合理的数据表示方法。若整型参数α、β的取值范围分别为-2²⁰~2²⁰、-2⁴⁰~2⁴⁰,则在下列选项中,α、β最适合采用的数据表示方法分别是()。 A. 32位整数、32位整数 B.单精度浮点数、单精度浮点数 C. 32位整数、双精度浮点数 D.单精度浮点数、双精度浮点数 44.【2025统考真题】已知float型变量用IEEE 754单精度浮点数格式表示。若float型变量x的机器数为47300000H,则x的值是()。 A. 0.375×2¹⁴ B. 1.375×2¹⁴ C. 0.375×2¹⁵ D. 1.375×2¹⁵ 45.【2025统考真题】某32位计算机按字节编址,采用小端方式存放数据,编译器按边界对齐方式为下列C语言结构型数组变量employee分配存储空间。 struct record { int id; char name[10]; int salary; }employee[200]; 若employee的首地址为0000A0B0H, employee[]。id的机器数为12345678H,则该机器数中的56H所在存储单元的地址是()。 A. 0000A0C3H B. 0000A0C4H C. 0000A0C5H D. 0000A0C6H 二、综合应用题 01.现有一计算机字长32位(D₃₁~D₀),符号位是最高位。 对于二进制10001111110111110000000000000000, 1)表示一个补码整数,其十进制值是多少? 2)表示一个无符号整数,其十进制值是多少? 3)表示一个IEEE 754标准的单精度浮点数,其值是多少? 02.假定变量i是一个32位的int型整数,f和d分别为float型(32位)和double型(64位)实数。分析下列各布尔表达式,说明结果是否在任何情况下都是“true”。 1)i==(int)((double)i) 2)f==(float)((int)f) 3)f==(float)((double)f) 4)d==(double)((float)d) 03.已知两个实数x=-68,y=-8.25,它们在C语言中定义为float型变量,分别存放在寄存器A和B中。另外,还有两个寄存器C和D。A、B、C、D都是32位的寄存器。请问(要求用十六进制表示二进制序列): 1)寄存器A和B中的内容分别是什么? 66 2027年计算机组成原理考研复习指导 2) x和y相加后的结果存放在寄存器C中,寄存器C中的内容是什么? 3) x和y相减后的结果存放在寄存器D中,寄存器D中的内容是什么? 04.对下列每个IEEE 754单精度数值,解释它们所表示的是哪种数字类型(规格化数、非规格化数、无穷大、0)。当它们表示某个具体数值时,请给出该数值。 1)0000 0000 0000 0000 0000 0000 0000 0000 2)0100 0010 0100 0000 0000 0000 0000 0000 3)1000 0000 0100 0000 0000 0000 0000 0000 4)1111 1111 1000 0000 0000 0000 0000 0000 05.【2017统考真题】已知f(n)=sumlimits {i=0}^{n}2^i=2^n+1-1=11···1B,计算f(n)的C语言函数f1如下: int f1(unsigned n){ int sum=1, power=1; for(unsigned i=0; i<=n-1; i++){ power *= 2; sum += power; } return sum; } 将f1中的int都改为float,可得到计算f(n)的另一个函数f2。假设unsigned型和int型数据都占32位,float型数据采用IEEE 754单精度标准。请回答下列问题: 1)当n=0时,f1会出现死循环,为什么?若将f1中的变量i和n都定义为int型,则f1是否还会出现死循环?为什么? 2)f1(23)和f2(23)的返回值是否相等?机器数各是什么(用十六进制表示)? 3)f1(24)和f2(24)的返回值分别为33554431和33554432.0,为什么不相等? 4)f(31)=2³²-1,而f1(31)的返回值却为-1,为什么?若使f1(n)的返回值与f(n)相等,则最大的n是多少? 5)f2(127)的机器数为7F800000H,对应的值是什么?若使f2(n)的结果不溢出,则最大的n是多少?若使f2(n)的结果精确(无舍入),则最大的n是多少? 2.3.6 答案与解析 一、单项选择题 01. C 不同类型的数据混合运算时,遵循的原则是“类型提升”,即较低类型转换为较高类型,最终结果为double型。4种类型数据的转换规律为char→int→long→double。 例如,long型数据与int型数据一起运算时,需先将int型转换为long型,然后两者再进行运算,结果为long型。float型数据和double型数据一起运算时,虽然它们同为实型,但两者精度不同,仍要先将float型转换为double型再进行运算,结果亦为double型。所有这些转换都是由系统自动进行的,这种转换通常称为隐式转换。 注意在强制类型转换中,从int型转换为float型时,虽然不会发生溢出,但因尾数位数的关系,可能有数据舍入,而转换为double型则能保留精度。double型转换为float型时亦是如此。从float型或double型转换为int型时,小数部分被截断,且由于int型的表示范围更小,还可能发生溢出。 02. B 在浮点数总位数不变的情况下,阶码位数越多,尾数位数越少;即表示的数的范围越大,精 第2章 数据的表示和运算 67 度越差(数变稀疏)。 03.A IEEE 754标准中尾数采用原码表示,阶码部分用移码表示。 04.B 长浮点数,其阶码为11位,尾数为52位,采取隐藏位策略,因此其最小规格化负数为阶码取最大值2^{+1023}(1023=2^{11-1}-1),尾数取最大值2-2^{-52}(注意其有隐藏位要加1),符号位为负。 05.D 在IEEE 754单精度浮点数中,最高位为符号位;其后是8位阶码,以2为底,用移码表示,阶码的偏置值为127;其后23位是尾数数值位。对于规格化的二进制浮点数,数值的最高位总是“1”,为了能使尾数多表示一位有效值,将这个“1”隐藏,因此尾数数值实际上是24位。隐藏的“1”是一位整数。在浮点格式中表示出来的23位尾数是纯小数,用原码表示。41A4C000H写成二进制为0100 0001 1010 0100 1100 0000 0000 0000,第一位为符号位0,表示是正数。之后的8位1000 0011表示阶码,真值为(100)B,即4。剩下的是隐藏了最高位1的尾数,所以为1.0100100 1100 0000 0000 0000,数值左移四位后整数部分10100表示为20。 06.D 在浮点数编码表示中,基数的值是约定好的,因此将其隐含。 07.D 这个机器数的最高位为1,对于原码、补码、单精度浮点数而言为负数,对于移码而言为正数,所以移码最大,而补码为-2^{28},原码为-(2^{30}+2^{29}+2^{28}),单精度浮点数为-1.0×2^{97},大小依次递减。 08.D 与非规格化浮点数相比,采用规格化浮点数的目的主要是为了增加数据的表示精度。 09.D IEEE 754单精度浮点数的阶码偏置为127,规格化数的阶码范围为1\sim 254(对应真值指数-126\sim +127),非规格化数用于表示接近零的数值。1.0×2^{-126}是最小规格化正数,最小非规格化正数为1.0×2^{-149},仅当\mid x\mid小于此值时才舍入为机器零。最大可表示正数为(2-2^{-23})×2^{127},仅当\mid x\mid超过该值时才溢出。IEEE 754浮点数的表示范围在正负区间完全对称,故说法Ⅲ和Ⅳ正确。 10.A 运算结果在0至规格化最小正数之间时称为正下溢,运算结果在0至规格化最大负数之间时称为负下溢,正下溢和负下溢统称下溢。 11.C 判断浮点数运算是否溢出,取决于阶码是否上溢。阶码下溢可以通过非规格化数来表示。尾数上溢或下溢,可以通过左移或右移进行调整。 12.B 写成二进制表示为0100 0101 0001 0000 0000 0000 0000,第一位为符号位,0表示正数,随后8位(float型)1000 1010是用移码表示的阶码,因此减去0111 1111后得十进制数11,而IEEE 754标准中单精度浮点数在阶码不为0时隐藏1,因此尾数为(1.0010)_{B}=(1.125)_{D},因此该数值为(+1.125)_{10}×2^{11}。 13.A 规格化IEEE 754浮点数尾数部分的数值范围为[1,2),x=-1111110B=-1.111110B×2^{6},y=1111.11B=1.11111B×2^{3},所以浮点数x、y的阶数分别为6和3。对阶操作是小阶码向大阶码看齐,即y的阶数变为6,移码表示为6+127=133,即10000101B;y的尾数右移3位,变为0.00111111B。 68 2027年计算机组成原理考研复习指导 14. B x=1.0=(1.0)₂×2⁹,尾数为100...0(隐含的1加上23个0)。y=0.1=(1.10011…)₂×2⁻⁴,尾数为1.10011001100110011001101(最低有效位之后的3位为110,故末位加1)。执行x+y时对阶:将y的尾数右移4位使其与x同阶(2⁹),得0.000110011001100110011001101。将其与x的尾数100...0相加,得1.000110011001100110011001101。根据1101进行就近舍入,末位加1,得1.00011001100110011001101。最终编码为:符号位为0,阶码为127=01111111,尾数为(隐含1)00011001100110011001101,组合并转换成十六进制数为3F8C CCCD。 15. A 在IEEE 754标准浮点格式中,阶码全为0,尾数不全为0表示非规格化数,非规格化数可用于处理阶码下溢,使得出现比最小规格化数还小的数时程序也能继续进行下去。 16. C IEEE 754单精度规格化数的有效数字为24位(1.f₂₂f₂₁…f₀),其中前导“1”是隐含的,未实际存储。对阶时,必须先恢复该隐含位,与23位尾数拼接成24位,再整体右移(高位补0)以对齐阶码。因此,前导“1”会随尾数一同参与移位,可能被移出,选项A错误,选项C正确。右移是逻辑右移,高位补0;若补1,将导致数值错误,选项B错误。非规格化数无隐藏位,选项D错误。 17. B IEEE 754单精度浮点数的有效数字为24位(含隐含前导1)。对阶时,若阶差ΔE≥25,则小阶操作数的隐含1将右移至舍入位或更低位,导致保护位为0。根据就近舍入规则,此时无论舍入位和粘滞位为何值,均直接截断,不会进位。因此,结果直接取大阶操作数。 18. D 机器字长是CPU一次能处理的定点整数位数,通常等于通用寄存器位数和定点运算数据通路宽度。机器字长越长,定点数的表示范围越大,可精确表示的整数位数越多。机器字长直接影响寄存器、ALU、总线等硬件的位宽,字长越长,电路规模越大,硬件成本显著增加。 19. D 信息在存储器中按边界对齐方式存储的含义是信息单元的存储地址是其字节长度的整数倍。这样可以保证对一个字长数据的读/写只需要一次存储器访问,提高了访存效率,但有时会导致存储空间的浪费。因此,这是一种以空间换时间的办法。 20. D 说法Ⅰ非永真,因为x+y可能溢出,而dx+dy不会溢出,两者结果可能不同。说法Ⅱ永真,由于dx、dy和dz均由32位int转换而到,double可精确地表示int,且对阶时尾数移动位数不会超过52位,因此尾数不会舍入,不会发生大数吃小数[当两浮点数阶码相差超过尾数位宽(24/53位)时,小阶操作数在右移后有效位全部丢失,导致加法结果等于大阶操作数]的情况。 21. A 二维数组b的元素是short型,占2字节,采用按行优先存储,b[0][0]的地址为0x8049820,b[0][1]的地址为0x8049822,以此类推,b[1][2]的地址为0x804982c。b[1][2]的值为-6,补码表示为1111111111111010,采用小端方式存储,因此地址0x804982c存放的是低位字节FAH。 22. D 小端方式是将最低有效字节存储在最小位置。在数01234567H中,最低有效字节为67H。 23. A 结构体按边界对齐存放的要求:数据成员的起始地址是其数据类型大小的整数倍,char型占1字节,char型的起始地址必须是1字节的整数倍;unsigned型占4字节,所以unsigned型的起始地址必须是4字节的整数倍。据此分析,id的起始地址为0x8049820,post的起始地址为 第2章 数据的表示和运算 69 0x8049824,所以phone的起始地址为0x8049828.结构体x的存放方式如下所示。 地址 地址 8049820H 8049821H 8049822H 8049823H char 8049824H 8049825H 8049826H 8049827H post 8049828H 8049829H 804982AH 804982BH phone 地址 24. D 对于选项A和B,int型的有效位数不会超过31位,float型的有效位数比double型的小得多,因此都能精确转换为具有53位有效位的double型。对于选项(C,12345<1024×16=2¹⁴,因此12345对应的二进制的位数一定小于14,因此可精确转换为具有24位有效位的float型。对于选项D,f=1234.5,转换为int型后,小数点后面的数字丢失,因此与原来的f不相等。 25. B 整数与整数运算,结果为整数,所以m/2的结果为6。实数与整数运算,结果为实数,所以a/2的结果为6.3,相加为12.3.C语言的输出格式可使输出值保留小数点后6位,输出为12.300000. 26. D X的浮点数格式为00,111;00,11101(分号前为阶码,分号后为尾数),Y的浮点数格式为00,101;00,10100.然后根据浮点数的加法步骤进行运算。 ① 对阶。X、Y阶码相减,即00,111-00,101=00,111+11,011=00,010, 可知X的阶码比Y的阶码大2(这一步可直接目测)。根据小阶码向大阶码看齐的原则,将Y的阶码加2,尾数右移2位,将Y变为00,111;00,00101. ② 尾数相加。即00,11101+00,00101=01,00010, 尾数相加结果符号位为01, 因此需要右规。 ③ 规格化。将尾数右移1位,阶码加1, 得X+Y为01,000;00,10001. ④ 判断溢出。阶码符号位为01,说明发生溢出。 本题容易误选选项 B、C,因为选项 B、C本身并无计算错误,只是它们不是最终结果,选项B少了第3步和第4步,选项C少了第4步。 27. B 题中三种数据类型强制类型转换的顺序为int→float→double。若将float型转换为int型,小数位部分会被舍去,int型是精确到32位的整数,而float型只保存到1+23位,因此一个32位的int型整数在转换为float型时可能有损失,具体判断方法如下:先将int型整数转换为二进制真值,然后将真值写为±1. x…x×2"的形式,若小数点后的位数超过23位,则转换为float型会发生精度损失。本题中i=785,转换为二进制真值为1.100010001×2⁹,小数点后只有9位,不会发生精度损失,说法Ⅰ正确。对于说法Ⅱ,将float型的f转换为int型,小数点后的数位丢失,结果非真。double型的精度和范围都比float型的大,float型转换为double型不会有损失,说法Ⅲ正确。对于说法Ⅳ,初看似乎没有问题,但浮点运算d+f时需要对阶,对阶后f的尾数有效位被舍去而变为0,因此d+f仍然为d,再减去d后结果为0,结果非真。注意,从int型转换为float型时,虽然不会发生溢出,但由于尾数位数的关系,可能有数据舍入,影响精度,而转换为double型则能保留精度。 28. A 本题的目的在于考查IEEE 754单精度浮点数的表示。首先先将x转换为二进制数,即-1000.01=- 1 . 0 0 0 0 1 × 2^{3} ,然后计算阶码E,根据IEEE 754单精度浮点数格式,有E-127=3, 因此E=130,转换为二进制数,即10000010.最后,根据IEEE 754标准,最高位的1是被隐藏的。 IEEE 754单精度浮点数格式:符号(1位)+阶码(8位)+尾数(23位)。 70 2027年计算机组成原理考研复习指导 因此FR1 的内容为1;10000010;0000 1000 000000000000000. 即11000001000001000000000000000=C1040000H. 本题易误选选项D,未考虑IEEE 754标准隐藏最高位1的情况,把偏置值认为是128. 29. D IEEE754单精度浮点数是尾数用采取隐藏位策略的原码表示,且阶码用移码(偏置值为127)表示的浮点数。规格化短浮点数的真值为(( - 1)^{S} × 1 . m × 2^{E - 1 2 7} ,其中S为符号位,阶码E的取值为1~254(8位表示),尾数m为23位,共32位;因此,float型能表示的最大整数是1 . 1 1 1 \cdots 1 × 2^{2 5 4 - 1 2 7} =2^{1 2 7}\times(2 - 2^{ - 2 3}) = 2^{1 2 8} - 2^{1 0 4}。 【另解】IEEE 754单精度浮点数格式如下图所示。 符号(1) 阶码 (8) 尾数(23) 表示最大正整数时:符号取 0;阶码取最大值 127;尾数部分隐藏了整数部分的“1”,23位尾数全取1时尾数最大,为2 - 2^{ - 2 3} ,此时浮点数的大小为(2 - 2^{ - 2 3}) × 2^{1 2 7} = 2^{1 2 8} - 2^{1 0 4}。 30. D 尽管record大小为7B(成员a有4B,成员b有1B,成员c有2B),因为数据按边界对齐方式存储,所以record共占用8B.record. a的十六进制表示为0x00000111,因为采用小端方式存放数据,所以地址0xC008中的内容应为低字节0x11;record. b只占1B,后面的1B留空;record. c占2B,因此其地址为0xC00E。各字节的存储分配如下表所示。 地址 0xC008 0xC009 0xC00A 0xC00B 内容 record. a(0x11) record. a(0x01) record. a(0x00) record. a(0x00) 地址 0xC00C 0xC00D 0xC00E 0xC00F 内容 record. b record. c record. c 31. A IEEE 754单精度浮点数格式为C640 0000H, 二进制格式为1100 0110 0100 0000 0000 00000000 0000,转换为标准的格式为 符号 阶码 尾数 1 1000 1100 1000000 0000 000000000000 符号为1表示负数;阶码为10001100-0111 1111=00001101=13;尾数为1.5(注意其有隐藏位,要加1)。因此,浮点数的值为- 1 . 5 × 2^{1 3}。 32. A (f1)和(f2)对应的二进制分别是(110011001001...)₂和(101100001100...)₂, 根据IEEE 754浮点数标准,可知(f1)的符号为1,阶码为10011001,尾数为1.001,而(f2)的符号为1,阶码为01100001,尾数为1.1,可知两数均为负数,符号相同,B、D排除;(f1)的绝对值为1 . 0 0 1 × 2^{2 6} ,(f2)的绝对值为1 . 1 × 2^{ - 3 0} ,(f1)的绝对值比(f2)的绝对值大,而符号为负,真值大小相反,即(f1)的真值比(f2)的真值小,即x格式化容量,因需预留扇区间隙、同步字段等格式开销。 考点追踪磁盘存取时间的计算(2013、2015、2022) ③响应时间与存取时间。磁盘处理一次读/写请求的完整过程包括请求排队、控制器解析以及三个关键物理操作:寻道、旋转等待和数据传输。因此,总响应时间为响应时间=排队延迟+控制器时间+寻道时间+旋转等待时间+数据传输时间其中,“寻道时间+旋转等待时间+数据传输时间”也称存取时间,特指从磁头定位开始到数据传输完成所需的时间,是衡量磁盘性能的核心指标。 ●寻道时间:磁头移动到目标磁道所需时间。平均寻道时间通常取最大寻道时间的一半(从最外道到最内道时间的1/2)。 2027年计算机组成原理考研复习指导 ●旋转等待时间:目标扇区旋转至磁头下方所需时间。平均旋转等待时间等于磁盘旋转半周的时间。 ●数据传输时间:读取或写入一个扇区所需时间,取决于磁盘转速和数据密度。 ④数据传输速率。指磁盘在单位时间内向主机传送的数据量(单位为B/s)。若磁盘转速为r转/秒,单磁道容量为N字节,则最大数据传输速率为 Dr=rN (4)磁盘地址 考点追踪 磁盘地址结构的计算(2022) 主机向磁盘控制器发送寻址信息,磁盘地址通常由三部分组成,如下图所示。 柱面(磁道)号 盘面(磁头)号 扇区号 例如,磁盘有16个盘面,每个盘面有256个磁道,每个磁道划分为16个扇区,则每个扇区的地址可用16位二进制代码表示:其中柱面号占8位,盘面号占4位,扇区号占4位。 (5)磁盘的工作过程 磁盘的主要操作包括寻址、读盘和写盘。每种操作对应一个控制字。磁盘工作时,首先读取控制字,然后执行该控制字。由于磁盘是机械式部件,因此其读/写操作为串行执行。 2.磁盘阵列 RAID(独立冗余磁盘阵列)是指将多个独立的物理磁盘组合成一个逻辑磁盘,数据在多个物理盘上交叉分割存储并并行访问,从而获得更高的存储性能、可靠性与安全性。 考点追踪 提高RAID可靠性的措施(2013) RAID的分级如下所示。在RAID1~RAID5等方案中,当任意磁盘发生故障时,可随时拔出损坏磁盘并插入新盘,系统仍能恢复或维持数据完整性,显著提升了可靠性。 ●RAID0:无冗余、无校验的磁盘阵列。 ●RAID1:镜像磁盘阵列。 ●RAID2:采用海明码进行纠错的磁盘阵列。 ●RAID3:位交叉奇偶校验的磁盘阵列。 ●RAID4:块交叉奇偶校验的磁盘阵列。 ●RAID5:无独立校验盘的分布式奇偶校验磁盘阵列。 RAID0将连续的多个数据块交替存放在不同物理磁盘的扇区中,利用多个磁盘交叉并行读/写,即条带化技术,不仅扩展了存储容量,还显著提高了存取速度,但不具备容错能力。 为提高可靠性,RAID1通过两个磁盘同步进行读/写操作,互为镜像备份。当一个磁盘故障时,可从另一磁盘完整读取数据。其代价是有效容量减半(两盘仅当一盘使用)。 总之,RAID通过多磁盘并行工作提升数据传输速率;通过并行存取大幅提高存储系统的吞吐量;通过镜像实现高可用性;通过校验机制提高容错能力。 3.4.2 固态硬盘 1.固态硬盘的特性 固态硬盘(SSD)是一种基于闪存技术的存储设备。其存储介质与U盘类似,但容量更大、存取性能更优。一个SSD由一个或多个闪存芯片以及闪存翻译层组成,如图316所示。其中,闪存芯片替代了传统磁盘中的机械驱动器;而闪存翻译层负责将CPU发出的逻辑块读/写请求转 第3章存储系统 换为对底层物理闪存的读/写控制信号,因此,闪存翻译层相当于代替了磁盘控制器的角色。 I/O总线 固态硬盘(SSD) 读/写逻辑磁盘块 闪存翻译层 闪存 块0 块B-1 页0 页1 页P-1 页0 页1 页P-1 图3.16 固态硬盘(SSD)结构组成 一个闪存芯片由B个块组成,每个块包含P页。通常,页的大小为512B~4KB,每块包含32~128页,块的大小为16KB~512KB。读/写操作以页为单位进行;擦除操作以块为单位进行,只有在整块被擦除后,才能向其中的页写入新数据。一旦某块被擦除,其所有页均可重新写入一次。每个块的擦写次数有限,经过若干重复写入后,该块会因磨损而失效。 随机写入速度较慢,主要有两个原因:①擦除操作耗时较长,通常比页访问慢一个数量级。②若需修改一个已包含有效数据的页P₁,必须先将该块中所有有效页复制到一个新的(已擦除的)块中,再执行对P₁的写入。 相比传统机械磁盘,SSD具有显著优势:由半导体器件构成,无机械运动部件,因此随机访问延迟极低,且无噪声、无振动、功耗更低、抗震性强、安全性更高。 2.磨损均衡(Wear Leveling) SSD的主要缺点在于闪存的擦写寿命有限,通常仅为几百至几千次。若直接用普通闪存构建SSD而不加管理,则实际的寿命表现可能令人失望——因为读/写操作往往会集中在少数物理块上,导致这些区域迅速磨损。一旦这部分闪存损坏,整块SSD即告失效。这种磨损不均衡的情况,可能导致一块256GB的SSD,仅因几兆字节的闪存损坏而报废。 为解决这一问题,SSD引入了磨损均衡技术,主要分为两类: 1)动态磨损均衡。在写入数据时,优先选择擦写次数较少的空闲块,避免反复写入同一区域,从而将写入负载分散到更多物理块上。 2)静态磨损均衡。这是一种更高级的策略。即使没有新数据写入,控制器也会定期扫描并自动进行数据迁移,将高磨损块中的有效数据迁移到低磨损块中。使高磨损块转为以读为主,低磨损块承担更多写入任务,进一步均衡整体寿命。 得益于磨损均衡算法,SSD的实际使用寿命显著提升。例如,一块256GB的SSD,若其闪存的擦写寿命为500次,则理论总写入量可达125TB。即使每天持续写入10GB数据,也需要三十多年才会达到寿命极限。而日常使用中,普通用户的日均写入量通常远低于此值。 3.4.3 本节习题精选 一、单项选择题 01.下列关于磁盘的说法中,错误的是( )。 A.本质上,U盘(闪存)是一种只读存储器 B.RAID技术可以提高磁盘的磁记录密度和磁盘利用率 106 2027年计算机组成原理考研复习指导 C. 未格式化的硬盘容量要大于格式化后的实际容量 D. 计算磁盘的存取时间时,“寻道时间”和“旋转等待时间”常取其平均值 02. 下列关于磁盘驱动器的叙述中,错误的是( )。 A. 送到磁盘驱动器的地址由磁头号、盘面号和扇区号组成 B. 能控制磁头移动到指定磁道,并发回“寻道结束”信号 C. 能控制磁盘片转过指定的扇区,并发回“扇区符合”信号 D. 能控制对指定盘面的指定扇区进行数据的读/写操作 03. 下列有关磁盘存储器读/写操作的叙述中,错误的是( )。 A. 最小读/写单位可以是一个扇区 B. 采用直接存储器存取DMA方式进行输入/输出 C. 按批处理方式进行一个数据块的读/写 D. 磁盘存储器可与CPU交换盘面上的存储信息 04. 若磁盘的转速提高一倍,则( )。 A. 平均寻道时间减少一半 B. 存取速度也提高一倍 C. 平均旋转等待时间减少一半 D. 不影响磁盘传输速率 05. 下列关于固态硬盘(SSD)的叙述中,不正确的是( )。 A. 固态硬盘的读/写是以页为单位的 B. 固态硬盘的擦除是以页为单位的 C. 固态硬盘的写入速度比读取速度慢很多 D. 固态硬盘的写入次数有限,引入磨损均衡可以延长使用寿命 06. 下列关于固态硬盘(SSD)的说法中,错误的是( )。 A. 基于闪存的存储技术 B. 随机读/写性能明显高于磁盘 C. 随机写比较慢 D. 读/写速度快,常用作主存 07. 一个磁盘的转速为7200转/分,每个磁道有160个扇区,每个扇区有512字节,则在理想情况下,磁盘每秒传输的数据量是( )。 A. 7200×160KB B. 7200KB C. 9600KB D. 19200KB 08. 某磁盘盘面共有200个磁道,盘面总存储容量为60MB,磁盘旋转一周的时间为25ms,每个磁道有8个扇区,各扇区之间有一间隙,磁头通过每个间隙需1.25ms。则磁盘接口所需的最大传输速率是( )。 A. 10MB/s B. 60MB/s C. 83.3MB/s D. 20MB/s 09. 【2013统考真题】某磁盘的转速为10000转/分,平均寻道时间是6ms,磁盘传输速率是20MB/s,磁盘控制器延迟为0.2ms,读取一个4KB的扇区所需的平均时间约为( )。 A. 9ms B. 9.4ms C. 12ms D. 12.4ms 10. 【2013统考真题】下列选项中,用于提高RAID可靠性的措施有( )。 I. 磁盘镜像 II. 条带化 III. 奇偶校验 IV. 增加Cache机制 A. 仅I、II B. 仅I、III C. 仅I、III和IV D. 仅II、III和IV 11. 【2015统考真题】若磁盘转速为7200转/分,平均寻道时间为8ms,每个磁道包含1000个扇区,则访问一个扇区的平均存取时间大约是( )。 A. 8.1ms B. 12.2ms C. 16.3ms D. 20.5ms 12. 【2019统考真题】下列关于磁盘存储器的叙述中,错误的是( )。 第3章 存储系统 107 A.磁盘的格式化容量比非格式化容量小 B.扇区中包含数据、地址和校验等信息 C.磁盘存储器的最小读/写单位为1字节 D.磁盘存储器由磁盘控制器、磁盘驱动器和盘片组成 二、综合应用题 01. 某个硬磁盘共有4个记录面,存储区域内半径为10cm,外半径为15.5cm,道密度为60道/cm,外层位密度为 600bit/cm,转速为6000转/分。 1)硬磁盘的磁道总数是多少? 2)硬磁盘的容量是多少? 3)将长度超过一个磁道容量的文件记录在同一个柱面上是否合理? 4)采用定长数据块记录格式,直接寻址的最小单位是什么?寻址命令中磁盘地址如何表示? 5)假定每个扇区的容量为512B,每个磁道有12个扇区,寻道的平均等待时间为10.5ms,试计算磁盘平均存取一个扇区的时间。 3.4.4 答案与解析 一、单项选择题 01. B 闪存是在 E²PROM的基础上发展起来的,本质上是只读存储器。RAID 将多个物理盘组成像单个逻辑盘,不会影响磁记录密度,也不可能提高磁盘利用率。在磁盘的格式化过程中,要对磁盘划分扇区,每个扇区要写入一些控制信息,扇区尾部还要留有一定的空隙,这些均需占用一些存储空间,因此导致格式化后的实际容量比非格式化的容量要小。 02. A 因为每个盘面对应一个磁头,所以盘面号和磁头号是同一个概念,显然A的说法是错误的,磁盘地址应该由磁道号(柱面号)、磁头号(盘面号)和扇区号组成。 03. D 磁盘存储器以成批(组)方式进行数据读/写,CPU 中没有那么多通用寄存器用于存放交换的数据,且磁盘与通用寄存器的传输速率相差过大,因此磁盘存储器通常直接和主存交换信息。 04. C 磁盘存取的步骤为:启动磁头、寻找磁道(寻道时间)、查找扇区(旋转等待时间)、传输数据,转速提高对寻道时间无影响;存取速度取决于所有步骤的时间,虽然会提高,但不会提高一倍;平均旋转等待时间为旋转半圈的时间,因此会减少一半;转速提高则传输速率也提高。 05. B 固态硬盘的擦除以块为单位,读/写以页为单位,选项 B 错误。固态硬盘的写入速度比读取速度要慢很多,因为在写入时需要擦除,且写入次数有限,否则相应块就会因为磨损而无法再次写入。 06. D 固态硬盘基于闪存技术,没有机械部件,随机读/写不需要机械操作,因此速度明显高于磁盘,选项A和B正确。选项C已在考点讲解中解释过。SSD常用作外存而非主存,选项D错误。 108 2027年计算机组成原理考研复习指导 07. C 磁盘的转速为7200转/分=120转/秒,转一圈经过160个扇区,每个扇区为512B,所以磁盘每秒传输的数据量为120×160×512/1024=9600KB。 08. D 每个磁道的容量=60MB/200=0.3MB,读一个磁道数据的时间等于磁盘旋转一周的时间减去通过扇区间隙的总时间(每个磁道有8个间隙),即25ms-1.25ms×8=15ms,数据传输速率=0.3MB/15ms=20MB/s。 09. B 磁盘转速是10000转/分,转一圈的时间为6ms,因此平均查询扇区的时间为3ms,平均寻道时间为6ms,读取4KB扇区信息的时间为4KB÷20MB/s=0.2ms,磁盘控制器延迟为0.2ms,总时间为3+6+0.2+0.2=9.4ms。 10. B RAID0方案是无冗余和无校验的磁盘阵列技术,而RAID1~RAID5方案均是加入了冗余(镜像)或校验的磁盘阵列技术。因此,提高RAID可靠性的措施主要是对磁盘进行镜像和奇偶校验,其余选项不符合条件。条带化是一种将数据分片,分别存储至不同的磁盘,提高读/写速度的技术。条带化的优点是读/写速度快,缺点是没有冗余,若其中一块磁盘损坏,则数据就会丢失。因此,条带化通常和其他技术如磁盘镜像或奇偶校验结合使用,形成不同的RAID级别。 11. B 存取时间=寻道时间+旋转等待时间+传输时间。存取一个扇区的平均旋转等待时间为旋转半周的时间,即(60/7200)/2=4.17ms,传输时间为(60/7200)/1000=0.01ms,因此访问一个扇区的平均存取时间为4.17+0.01+8=12.18ms,保留一位小数则为12.2ms。 12. C 磁盘存储器的最小读/写单位为一个扇区,即磁盘按块存取。磁盘存储数据之前需要进行格式化,将磁盘分成扇区并写入信息,因此磁盘的格式化容量比非格式化容量小。磁盘扇区中包含数据、地址和校验等信息。磁盘存储器由磁盘控制器、磁盘驱动器和盘片组成。 二、综合应用题 01.【解答】 1)有效存储区域=15.5-10=5.5cm,道密度=60道/cm,因此每个面为60×5.5=330道,即有330个柱面,因此磁道总数=4×330=1320个磁道。 2)外层磁道的长度为2πR=2×3.14×15.5=97.34cm。 每道信息量=600bit/cm×97.34cm=58404bit=7300B。 利用1)的结果,可得磁盘总容量=7300B×1320=9636000B(非格式化容量)。 3)若长度超过一个磁道容量的文件,将它记录在同一个柱面上是比较合理的,因为不需要重新寻找磁道,这样数据读/写速度快。 4)采用定长数据块格式,直接寻址的最小单位是一个扇区,每个扇区记录固定字节数目的信息,在定长记录的数据块中,活动头磁盘组的编址方式可用如下格式: 柱面号 盘面号 扇区号 5)读一个扇区中数据所用的时间=找磁道的时间+找扇区的时间+磁头扫过一个扇区的时间。找磁道的时间是指磁头从当前所处磁道运动到目标磁道的时间,一般选用磁头在磁盘径 第3章存储系统 109 向方向上移动1/2个半径长度所用的时间为平均值来估算,题中给出的是10.5ms. 找扇区的时间是指磁头从当前所处扇区运动到目标扇区的时间,一般选用磁盘旋转半周所用的时间作为平均值来估算,题中给出磁盘转速为6000转/分,即100转/秒,所以磁盘转一周用时10ms,转半周用时5ms. 题中给出每个磁道有12个扇区,磁头扫过一个扇区用时为10/12=0.83ms,因此磁盘平均存取时间为10.5+5+0.83=16.33ms. 3.5 高速缓冲存储器 程序的转移概率通常较高,数据分布也较为离散,因此单纯依赖并行主存系统来提升主存效率是有限的。高速缓存(Cache)具有比主存更快的访问速度,因此在CPU与主存之间设置Cache可以显著提升存储系统的整体效率。Cache由SRAM组成,通常集成在CPU内部。 3.5.1程序访问的局部性原理 Cache的设计基于程序访问的局部性原理,包括时间局部性和空间局部性。 考点追踪 分析给定代码的时空局部性(2017、2023) 时间局部性是指如果某条指令或数据项当前被访问,则在不久的将来很可能再次被访问。这源于程序中存在循环、重复调用的子程序,以及对同一数据的多次操作。空间局部性是指如果某存储单元被访问,则其邻近的存储单元在不久的将来很可能也被访问。这是因为指令通常顺序存放并顺序执行,而数据(如数组、向量)也往往以连续块的形式存储。 高速缓冲技术正是利用局部性原理,将程序当前活跃的部分数据暂存于容量小但速度极快的Cache中,使CPU的多数访存操作直接在Cache中完成,从而显著提升程序执行效率。 【例3.1】假设数组元素按行优先方式存储,对于以下两个程序: 程序A: 程序B: 1 int sumarrayrows(int a[M][N]) 2 { 3 int i, j, sum =0; 4 for (i =0; i < M; i++) 5 for (j =0; j < N; j++) 6 sum += a[i][j]; 7 return sum; 8 } 1 int sumarraycols(int a[M][N]) 2 { 3 int i, j, sum =0; 4 for (j =0; j < N; j++) 5 for (i =0; i < M; i++) 6 sum += a[i][j]; 7 return sum; 8} 1)对于数组a的访问,哪个程序的空间局部性更好?哪个时间局部性更好? 2)对于指令访问,for循环体的空间局部性和时间局部性如何? 解:假设M和N均为2048,按字节编址,每个数组元素占4字节,则指令和数据在主存中的存放情况如图3.17所示。 考点追踪 数组按行或列访问的命中率分析(2010),数组循环访问的命中率分析(2016、2020) 1)对于数组a,程序A和程序B的空间局部性差异显著。 程序A按行访问:a[0][0],a[0][1],…,a[0][2047];a[1][0],a[1][1],…,a[1][2047];…。访问顺序与存放顺序是一致的,由于连续访问的元素位于相邻地址,空间局部性良好。 110 2027年计算机组成原理考研复习指导 程序B按列访问:a[0][0],a[1][0),...,a[2047][0],a[0][1],a[1][1],...,a[2047][1],...。访问顺序与存放顺序不一致,每次访问均需跨越2048个元素,即8192字节,若主存与Cache的交换单位小于8KB,则每次访问几乎都落在不同的Cache行中,空间局部性极差。 两个程序中,数组a的时间局部性均较差,因为每个数组元素仅被访问一次。 考点追踪 程序中指令Cache的命中率分析(2014) 2)对于for循环体的指令访问,程序A与程序B的局部性表现相同。因为循环体内的指令在内存中连续存放,顺序执行,空间局部性良好;整个循环共执行2048×2048次,时间局部性良好。 综上,尽管程序A与程序B功能完全相同,但由于内外循环顺序不同,导致对数组a访问的空间局部性存在巨大差异,进而造成实际执行效率的显著不同。 3.5.2 Cache的基本工作原理 为便于Cache与主存交换信息,Cache和主存都被划分为大小相等的块,Cache块也称Cache行,每块由若干字节组成,块的长度称为块长(也称行长)。因为Cache的容量远小于主存的容量,所以Cache中的块数要远少于主存中的块数,Cache中仅保存主存中最活跃的若干块的副本。因此,可按照某种策略预测CPU在未来一段时间内待访存的数据,将其装入Cache。 1. Cache的访问过程 考点追踪 Cache命中对CPU执行时间影响的分析(2013、2015) 图3.18所示为典型的Cache访问流程。CPU执行程序时,每当需要从主存取指令或读/写数据,首先访问Cache。若所需信息已在Cache中(称为Cache命中),则直接从Cache读取,无须访问主存;若未命中(也称缺失),则需从主存中将该地址所在的一个主存块整体调入Cache,并将该块写入一个Cache行(若Cache已满,则按替换算法选择被替换块)。此后,CPU再从Cache中获取所需数据。整个访问过程(包括命中判断、块调入、替换等)必须在单条指令执行周期内完成,因此完全由硬件实现。Cache机制对程序员是透明的。 上述访问流程是先查Cache,未命中再访主存,这是统考真题遵循的方式。部分系统采用“并行访问”策略(同时查Cache和主存),若命中,则提前终止主存访问,但考试中通常不涉及。 2. Cache的命中率分析 考点追踪 Cache命中率的分析与计算(2009、2025) CPU所需访问的信息已在Cache中的概率称为Cache命中率。设某程序执行期间,Cache命 第3章存储系统 111 中次数为Nc,访问主存的次数为Nm(未命中次数),则命中率H定义为 H=Nc/(Nc+Nm) 命中时:CPU直接从Cache读取数据,耗时为命中时间Tc(访问Cache的时间)。 未命中时:需先从主存读取包含目标数据的一个主存块送入Cache,再将所需数据送至CPU,总耗时为Tm+Tc。其中Tm称为缺失损失,即从主存调入一个块所需的时间。 因此,Cache-主存系统的平均访问时间Ta为 Ta=HTc+(1-H)(Tm+Tc)=Tc+(1-H)Tm 考点追踪 Cache缺失率对主存带宽的影响(2012) 【例3.2】假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提升多少(假设系统先访问Cache,未命中时才访问主存)? 解:设Cache的存取时间为t,则主存的存取时间为5t。系统的平均访问时间T为 T=命中时的访问时间×命中率+缺失时的访问时间×缺失率 =0.95×t+0.05×(1+5t)=1.25t 或等价地 T=命中时的访问时间+缺失时的访存开销×缺失率=t+0.05×5t=1.25t 可见,采用Cache后,存储器性能提升至原来的5t/1.25t=4倍。 根据Cache的读、写流程可知,实现Cache时需解决以下关键问题: 1)数据查找。如何快速判断所需数据是否在Cache中。 2)地址映射。主存块如何存放在Cache中,以及如何将主存地址转换为Cache地址。 3)替换策略。当Cache已满时,采用何种策略选择被替换的Cache行。 4)写入策略。如何在保证主存与Cache数据一致性的前提下,尽可能提升写操作效率。 3.5.3 Cache和主存的映射方式 由于Cache行数远少于主存块数,Cache只能存放主存中部分块的副本。为识别每个Cache行对应哪个主存块,需要为每行设置一个标记位,记录其主存块编号。同时设置一位有效位,用于指示该行数据是否有效。系统启动或复位时,所有Cache行均无效;仅当主存块被装入某Cache行后,其有效位才置为1。 地址映射是指将主存地址空间按一定规则映射到Cache地址空间,即决定主存块如何装入Cache。常见的映射方式有三种,包括直接映射、组相联映射和全相联映射。 1.直接映射 主存中的每一块只能装入Cache中的唯一指定位置。若该位置已有内容,则发生块冲突,原块将被无条件替换(无须替换算法)。直接映射实现简单,但灵活性差,即使Cache中其他行空闲,也不能用于存放该主存块,因此块冲突概率最高,空间利用率最低。 考点追踪直接映射的地址结构及映射关系的分析(2010、2011、2015) 直接映射关系可表示为 Cache行号=主存块号mod Cache总行数 设Cache共有2°行,主存共有2⁴块。则主存的第0块、第2°块、第2²⁺¹块…均映射到Cache的第0行;主存的第1块、第2°+1块、第2²⁺¹+1块…均映射到Cache的第1行,以此类推。 112 2027年计算机组成原理考研复习指导 由此可见,主存块号的低c位即为其对应的Cache行号。 为标识来源,每个Cache行设置一个长度为t=m-c的标记。当某主存块调入Cache后,将其块号的高t位存入对应Cache行的标记字段中,如图3.19(a)所示。 m位 第0块 t位 c位 b位 第1块 标记 行号 块内地址 t位 缺失 第0行 标记 数据 相等 不等 第1行 第2°-1块 比较 第2°块 第2°+1块 标记 主存 第2°-1行 标记 Cache : 标记 主存 命中 读出 第2"-1块 Cache读出 数据总线 主存 (a) Cache和主存之间的映射关系 (b)CPU访存过程 图3.19 Cache和主存之间的直接映射方式 直接映射的地址结构如下 标记 Cache行号 块内地址 CPU访存过程:根据访存地址中间的c位确定Cache行,将该Cache行中的标记与主存地址的高 t位进行比较,若标记相等且有效位为 1,则Cache命中,根据地址低位的块内地址从该Cache行中读取数据;若标记不等或有效位为0,则Cache未命中,CPU需从主存读取该地址所在块,将其装入对应Cache行,置有效位为1,更新标记为地址高t位,并将所需数据送至CPU. 2.全相联映射 主存中的每一块可以装入Cache中的任何位置,如图3.20所示。每行的标记用于指出该行来自主存的哪一块,因此CPU访存时需要与所有Cache行的标记进行比较。优点:①Cache块的冲突概率低,只要有空闲Cache行,就不会发生冲突;②空间利用率高;③命中率高。缺点:① 标记的比较速度较慢;②实现成本较高,通常需采用按内容寻址的相联存储器。 主存 第0块 Cache 第0行 标记 数据 第1块 第1行 第15块 第15行 11位 第2047块 11位 9位 主存地址 标记 块内地址 主存块号 图3.20 Cache和主存之间的全相联映射方式 全相联映射的地址结构如下 标记 块内地址 第3章 存储系统 113 CPU访存过程:首先将主存地址的高位标记(位数=\log_{2}主存块数)与Cache各行的标记进行比较。若有一个相等且对应有效位为1,则Cache命中,此时根据块内地址从该Cache行中取出信息;若都不相等或有效位为0,则Cache未命中,此时CPU从主存中读出该地址所在的一块信息装入Cache的任意一个空闲行,置有效位为1,并设置标记,同时将所需数据送至CPU。 考点追踪 根据地址结构和比较器数量判断映射方式(2018) 通常为每个Cache行都设置一个比较器,比较器的位数等于标记字段长度。访存时根据标记字段的内容访问Cache行中的主存块,因此其查找过程是一种按内容访问的存取方式,属于相联存储器。这种方式的时间开销和硬件开销都较大,不适合大容量Cache。 3.组相联映射 考点追踪 组相联映射的原理(2009、2016、2018~2020、2023) 将Cache划分为Q个大小相等的组,每个主存块只能映射到固定组中的任意一行,即组间采用直接映射,组内采用全相联映射,如图3.21所示。它是直接映射与全相联映射的一种折中方案:当Q=1(整个Cache为一个组)时,退化为全相联映射;当Q=Cache总行数(每组仅1行)时,退化为直接映射。设每组包含r个Cache行,则称为r路组相联映射。 路数r越大,组内可选位置越多,块冲突概率越低,但所需的比较器数量和控制逻辑也越复杂。合理选择r,可在硬件成本接近直接映射的同时,获得接近全相联映射的性能。 考点追踪 组相联映射的地址结构及映射关系的分析(2025) 组相联映射关系可表示为 Cache组号=主存块号modCache组数(Q) 组相联映射的地址结构如下 标记 组号 块内地址 考点追踪 组相联映射的访存过程及Cache缺失处理过程(2020) CPU访存过程:首先根据访存地址中的组号字段确定目标Cache组;将该组内所有Cache行的标记与主存地址的高位标记并行比较;若某行标记匹配且其有效位为1,则Cache命中,根据块内地址从该行读取数据;若所有行均不匹配或匹配行的有效位为0,则Cache未命中,CPU 114 2027年计算机组成原理考研复习指导 从主存读取该地址所在块,将其装入该组中任意一个空闲行(若无空闲行,则按替换算法选择一行),置有效位为1,写入标记,并将所需数据送至CPU。 考点追踪组相联映射中比较器的个数和位数(2022) 直接映射中每块仅对应一个唯一的Cache行,因此只需设置1个比较器。而r路组相联映射需在同一组的r个Cache行中并行比较,因此需设置r个比较器。 在Cache容量和主存块大小固定的条件下,三种映射方式的特性对比如下: 1)命中率:直接映射最低,全相联映射最高。 2)判断开销与所需时间:直接映射最小、最快,全相联映射最大、最慢。 3)标记存储开销:直接映射最少,全相联映射最多。 3.5.4 Cache中主存块的替换算法① 在采用全相联映射或组相联映射方式时,当向Cache传送一个新主存块而Cache(或Cache组)已满,就需要使用替换算法选择被替换的Cache行。而在直接映射中,每个主存块只能映射到唯一的Cache行,因此当该行已被占用时,新块直接覆盖旧块,无须替换算法。 常用的替换算法包括随机、先进先出、最近最少使用和最不经常使用算法。 1)随机(RAND)算法:随机选择一个Cache行进行替换。实现简单,但未利用程序访问的局部性原理,命中率通常较低。 2)先进先出(FIFO)算法:替换最早装入的Cache行。实现较容易,但未考虑局部性原理,最早进入的块可能仍是当前热点数据,因此命中率不高。 考点追踪组相联映射中LRU算法的命中率分析(2012、2021) 3)最近最少使用(LRU)算法:基于程序访问的局部性原理,优先替换最近最久未被访问的Cache行。其平均命中率通常高于FIFO.LRU算法是考查重点。 考点追踪LRU替换位及其位数的计算(2018、2020) 在硬件实现中,LRU算法为每组Cache维护一组计数器(常称LRU替换位),用来记录各Cache行的相对访问顺序。LRU位的位数取决于组的路数:2路组相联需1位LRU位,4路组相联需2位LRU位。假定采用4路组相联,5个主存块{1,2,3,4,5}映射到同一Cache组,访问序列为{1,2,3,4,1,2,5,1,2,3,4,5},LRU替换过程如图3.22所示。图中左边阴影部分的数字表示对应Cache行的LRU计数值(反映最近访问顺序),右侧数字为主存块号。 图3.22 LRU算法的替换过程示意图 计数器的更新规则:①命中时,所命中行的计数器清零,比其低的计数器加1,其余不变;②未命中且有空闲行时,新装入的行的计数器置0,其他非空闲行全加1;③未命中且无空闲行时,替换计数值最大(本例中为3)的行,新装入的行的计数器置0,其余全加1。 当被频繁访问的主存块数量超过Cache每组的行数时,可能导致持续缺失。例如,若访问序列变为1,2,3,4,5,1,2,3,4,5,…,而Cache每组仅有4行,则每次访问第5个块都会驱逐下一个 ①本考点建议结合《操作系统考研复习指导》复习。 第3章存储系统 115 将被访问的块,导致命中率为0,这种现象称为抖动。 4)最不经常使用(LFU)算法:替换一段时间内累计访问次数最少的Cache行。每行设置一个计数器,新行装入时计数器初始化为0,每次访问该行则计数器加1;替换时选择计数值最小的行。LFU与LRU的思想不同:LRU关注最近是否用过,LFU关注总共用了多少次。 3.5.5 Cache的一致性问题 由于Cache中的内容是主存块的副本,当对Cache进行写操作时,必须采用适当的写策略以维持Cache与主存数据的一致性。根据写操作是否命中Cache,可分为两类情况。所谓写命中是指CPU要写入的主存地址所在的块当前已在Cache中;反之则为写不命中。 1. Cache写命中的处理方法 考点追踪 直写法的原理及特点(2015、2020) (1)全写法(直写法, Write Through) 当CPU对Cache写命中时,数据同时写入Cache和主存。由于主存始终与Cache保持同步,因此在替换Cache块时,可直接覆盖,无须写回。该方法实现简单,能保证主存数据的实时正确性,但缺点是每次写操作都需访问主存,降低了系统性能。 为缓解直写法的性能开销,可在Cache与主存之间增设写缓冲(Write Buffer),如图3.23所示。CPU将数据同时写入Cache和写缓冲,由写缓冲异步地将数据写入主存。写缓冲可缓解CPU与主存之间的速度差异。但在高频率写操作下,写缓冲可能饱和甚至溢出。 考点追踪 回写法的原理及应用(2018、2020) (2)回写法(Write Back)① 当CPU对Cache写命中时,仅将数据写入Cache,不立即写入主存,仅在该块被替换出Cache时才写回主存。这种方法减少了主存访问次数,提高了Cache效率,但存在数据不一致的风险。为避免不必要的写回操作,每个Cache行设置一个修改位(又称脏位):若修改位为1,表示该行数据已被修改,替换时必须写回主存;若修改位为0,表示该行数据与主存一致,替换时可直接覆盖。需要注意的是,直写法无须脏位,因为主存始终同步;回写法则必须设置脏位。 2.Cache写不命中的处理方法 (1)写分配法(Write allocate)② 当发生写不命中时,先将数据写入主存的对应单元,然后将该主存块调入Cache的一个空闲行中。该方法利用了程序的空间局部性,但每次写不命中都要将主存块加载到Cache中。 (2)非写分配法(Not-Write-allocate) 当发生写不命中时,直接将数据写入主存,不将主存块调入Cache。 3.5.6 Cache容量的计算举例 在计算Cache总容量时,需考虑Cache行的数据部分和每行的标记信息,即Cache总容量=(每行标记位数+每行数据位数)×Cache总行数 ①大多数教材将其翻译为写回法,但2015年和2021年统考真题都采用回写法,所以本书采用该名称。 ②不同参考书的解释不同,《深入理解计算机系统》中的解释是“先把该主存块调入Cache,再在Cache中更新”。 116 2027年计算机组成原理考研复习指导 考点追踪 Cache标记信息的分析(2015、2021) 每行的标记信息通常包括:有效位、标记位、脏位和LRU替换位。其中,有效位和标记位是所有Cache必须包含的;脏位仅在采用回写策略时存在;LRU替换位仅在使用LRU算法时存在,其位数取决于组内行数。图3.24展示了不同映射方式下Cache各字段的组成与分布。 1位1位log₂(组内块数) 有效位 脏位 LRU位 标记位 Cache块数据 一行Cache的容量 直接映射 标记位 Cache行号 块内地址 全相联映射 标记位 块内地址 组相联映射 标记位 组号 块内地址 图3.24 不同映射方式下Cache各字段的组成与分布 考点追踪标记位分析及总容量的计算(2010、2021) 【例3.3】假设某计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行,行长为64B。请回答: 1)若不考虑脏位和替换算法控制位,并采用直接映射方式,求该数据Cache的总容量? 2)若采用直接映射方式,主存地址为3200(十进制)的主存块对应的Cache行号是多少?若采用2路组相联映射,对应的Cache组号及可能的行号是多少? 3)以直接映射方式为例,简述访存过程(设访存地址为0123456H)。 解: 1)Cache总容量=数据信息容量+标记信息容量(包括有效位和标记位)。本题不考虑脏位和替换算法控制位。主存地址位数为28位(主存地址空间为256MB=2²⁸B);块内地址位数为6位(行长64B=2⁶B); Cache行号为3位(Cache行数8=2³)。标记信息位数=28-6-3=19位。每行含1位有效位+19位标记位=20位标记信息。每行数据部分为64B=512位。因此,Cache总容量为8×(512+1+19)=4256位。 2)主存地址3200对应的块号为3200B/64B=50。在直接映射方式中,Cache有8行,行号=50mod8=2,故对应的Cache行号为2。 在组相联映射方式中,组内采用全相联映射,组外采用直接映射,组号=50mod4=2,即该块可映射到第2组中的任意一行,对应的Cache行号为4或5。 3)在直接映射方式中,28位主存地址可分为19位的标记位,3位的块号,6位的块内地址,即0000000100100011010为标记位,001为块号,010110为块内地址。 访存过程:根据行号010访问Cache第2行,比较其标记与地址高19位,并检查有效位:若匹配且有效位为1,则命中,按块内地址010110读取数据并送至CPU;否则未命中,从主存读取该块,写入Cache第2行,更新标记为地址高19位,并置有效位为1。 思考:若1)问中采用2路组相联映射方式,则Cache总容量是多少?结合主存与Cache的划分关系,推导2路组相联映射下的主存地址结构,并简述其访存过程。 3.5.7 Cache的应用 (1)分离Cache 考点追踪采用分离的指令与数据Cache的目的(2014) 随着指令流水技术的发展,现代处理器通常将指令Cache和数据Cache分开设计,形成分离 第3章存储系统 的Cache结构。统一Cache的优点在于其设计和实现相对简单,但在流水线执行中,取指部件和执行部件同时访问同一Cache时容易产生冲突。通过采用分离Cache结构,不仅可以消除这类冲突,还能针对指令和数据的不同局部性特征进行优化,从而提升整体性能。 (2)多级Cache 现代计算机普遍采用多级Cache结构。以两级为例,按距离CPU的远近分别称为L1 Cache和L2 Cache:L1离CPU最近,速度最快、容量较小;L2则较远,速度较慢、容量较大。通常情况下,L1级会采用分离的指令Cache和数据Cache设计,其中L1数据Cache在写操作中采用写分配法(写不命中时加载块)与回写法(写命中时不立即写主存)相结合的策略。图3.25展示了一个典型的两级Cache系统。通常,L1和L2 Cache均采用回写法,当L1发生写命中时,仅更新L1;当L1块被替换时,若为脏块,则写回L2;L2同理,在替换时写回主存。由于L2 Cache的访问速度远高于主存,L1无须在写命中时访问主存,仅更新本地Cache即可快速完成写操作;后续的脏块写回由L2高效承接,从而有效避免因频繁写操作导致的写缓冲饱和或溢出问题。 CPU L1 Cache L2 Cache DRAM Write Buffer 图3.25一个含有两级Cache的系统 3.5.8本节习题精选 一、单项选择题 01.在高速缓存系统中,主存容量为12MB,Cache容量为400KB,则该存储系统的容量为( )。 A. 12MB+400KB B. 12MB C. 12MB-12MB+400KB D. 12MB-400KB 02.访问Cache系统失效时,通常不仅主存向CPU传送信息,同时还需要将信息写入Cache,在此过程中传送和写入信息的数据宽度各为( )。 A.块、页 B.字、字 C.字、块 D.块、块 03.假定用作Cache的SRAM的存取时间为2ns,用作主存的SDRAM的存取时间为40ns。为使存储系统的平均存取时间达到3ns,则Cache命中率应达到( )左右。 A. 92.5% B. 85% C. 97.5% D. 99.9% 04.关于Cache的更新策略,下列说法中正确的是( )。 A.读操作时,全写法和回写法在命中时应用 B.写操作时,回写法和写分配法在命中时应用 C.读操作时,全写法和写分配法在失效时应用 D.写操作时,写分配法、非写分配法在失效时应用 05.在不同的情况下,需要采用适合的Cache写策略。对于下面两种情况:①主要运行访问密集型应用,其中包含写操作;②安全性要求很高,不允许有任何数据不一致的情况发生。适合它们的写策略分别是( )。 A.回写法,全写法 B.全写法,回写法 C.回写法,回写法 D.全写法,全写法 06.局部性通常有两种不同的形式:时间局部性和空间局部性。程序员是否能编写出高速缓 118 2027年计算机组成原理考研复习指导 存友好的代码,就取决于这两方面的问题。对于下面这个函数,说法正确的是( )。 int sumvec(int v[N]){ int i,sum=0; for(i=0;i1且KB,则A-B肯定无进位/借位,也不为0(为0时表示两数相等),因此CF和ZF均为0,选C。其余选项中用到了符号标志SF和溢出标志OF,SF表示结果的符号,OF是有符号整数的溢出标志 第4章指令系统 位,对于无符号数运算,SF和OF没有意义,显然应当排除。 26.D 根据变址寻址的方法,变址寄存器的内容(1000H)与形式地址的内容(2000H)相加,得到操作数的实际地址(3000H),根据实际地址访问内存,获取操作数4000H,如下图所示。 变址寄存器形式地址 1000H 2000H 地址内容 1000H 2000H 2000H 3000H 3000H 4000H 27.A 采用32位定长指令字,其中操作码为8位,两个地址码共占用32-8=24位,而STORE指令的源操作数和目的操作数分别采用寄存器直接寻址和基址寻址,机器中共有16个通用寄存器,因此寻址一个寄存器需要log216=4位,源操作数中的寄存器直接寻址用掉4位,而目的操作数采用基址寻址也要指定一个寄存器,同样用掉4位,则留给偏移量的位数为24-4-4=16位,而偏移量用补码表示,因此16位补码的表示范围为-32768~+32767。 28.C 在变址寻址中,有效地址(EA)等于指令字中的形式地址D与变址寄存器I的内容之和,即EA=(I)+D。间接寻址是相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数地址的地址,即EA=(D)。从而该操作数的有效地址是((I)+D)。 29.D 变址操作时,将计算机指令中的地址与变址寄存器中的地址相加,得到有效地址,指令提供数组首地址,由变址寄存器来定位数据中的各元素。所以它最适合按下标顺序访问一维数组元素,选择选项D。相对寻址以PC为基地址,以指令中的地址为偏移量确定有效地址。寄存器寻址则在指令中指出需要使用的寄存器。直接寻址在指令的地址字段直接指出操作数的有效地址。 30.B 根据变址寻址的公式EA=(IX)+A,有(IX)=2100H-2000H=100H=256, sizeof(double)=8(双精度浮点数用8位字节表示),因此数组的下标为256/8=32。 31.D 注意,内存地址是无符号数。 操作数采用基址寻址方式,EA=(BR)+A,基址寄存器BR的内容为F0000000H,形式地址用补码表示为FF12H即1111111100010010B,因此有效地址为F0000000H+(-00EEH)=EFFF FF12H。计算机采用大端方式编址,所以低位字节存放在字的高地址处,机器数一共占4字节,该操作数的LSB所在的地址是EFFFF FF12H+3=EFFF FF15H。 32.A 48条指令需要6位操作码字段(2⁵<48<2⁶),4种寻址方式需要2位寻址特征位(4=2²),还剩16-6-2=8位作为地址码,所以直接寻址范围为0~255。注意,主存地址不能为负。 33.A 指令字由操作码、寻址特征和地址码三个字段组成,寻址特征字段用来指明指令属于哪种寻址方式。若寻址方式是寄存器直接寻址,则地址码所指的通用寄存器中存放的是操作数,若寻址方式是寄存器间接寻址,则对应通用寄存器中存放的是操作数的地址。 170 2027年计算机组成原理考研复习指导 二、综合应用题 01.【解答】 取指令后, PC=1235H(注意,不是1236H, 因主存按字编址)。 ①X=00,D=20H,有效地址EA=20H. ②X=10, D=44H, 有效地址EA=1122H+44H=1166H. ③X=11, D=22H, 有效地址EA=1235H+22H=1257H. ④X=01, D=21H, 有效地址EA=0037H+21H=0058H. ⑤X=11, D=23H, 有效地址EA=1235H+23H=1258H. 02.【解答】 1)因为PC的增量是2,且每条指令占2字节,所以编址单位是字节。 2)根据“大于”条件判断表达式,可以看出该bgt指令实现的是有符号整数比较。因为无符号数比较时,其判断表达式中没有溢出标志OF。继续分析该逻辑表达式,bgt指令的含义是当两数相减的结果大于0时,执行转移操作。因此,要满足bgt指令的条件,必须保证如下两个条件:一是结果不为0,即零标志位ZF为0;二是结果的符号位与溢出标志位OF相同,即SF⊕OF为O(两数相减结果大于O,有两种情况:第一种情况是结果没有溢出,此时OF位和SF位都为0;第二种情况是结果发生了溢出,此时OF和SF位都为1)。综上所述,逻辑表达式可表示为ZF+(SF⊕OF)=0. 3)偏移地址Imm8为补码表示,说明转移目标地址可能在bgt指令之后。计算转移目标地址时,偏移量为Imm8×2,说明Imm8不是相对地址,而是相对指令数。Imm8的范围为-128~127,所以转移目标地址的范围是PC+2+(-128×2)~PC+2+127×2,也即转移目标地址的范围是相对于bgt指令的前127条指令到后128条指令之间。 03.【解答】 1)操作码占4位,则该指令系统最多可有2^{4} = 1 6条指令。操作数占6位,其中寻址方式占3位、寄存器编号占3位,因此该机最多有2^{3} = 8个通用寄存器。主存地址空间大小为128KB,按字编址,字长为16位,共有128KB/2B =2¹⁶个存储单元,因此MAR至少为16位;本题已说明了存储字长为16位,因此MDR至少为16位。 2)寄存器字长为16位,PC可以表示的地址范围为(0 ~2^{1 6} - 1 ,Rn可表示的相对偏移量为-2¹⁵~2^{1 5} - 1 ,而主存地址空间为2¹⁶,因此转移指令的目标地址范围为0000H~FFFFH (0~2¹⁶-1). 3)汇编语句“add(R4),(R5)+”对应的机器码为 字 段 OP Ms Rs Md Rd 内 容 0010 001 100 010 101 说 明 add 寄存器间接 R4 寄存器间接、自增 R5 将对应的机器码写成十六进制数形式为00100011 00010101B=2315H. 该指令的功能是将R4 的内容所指的存储单元的数据与R5的内容所指的存储单元的数据相加,并将结果送入R5的内容所指的存储单元中。(R4)=1234H,(1234H)=5678H;(R5)=5678H,(5678H)=1234H; 执行加法操作5678H+1234H=68ACH.之后R5 自增。 该指令执行后,R5和存储单元5678H的内容会改变,R5的内容从5678H变为5679H,存储单元5678H中的内容变为该指令的计算结果68ACH. 04.【解答】 1)因为指令长度为16位,且下一条指令地址为(PC)+2,因此编址单位是字节。 第4章指令系统 相对偏移量OFFSET为8位补码,表示范围为-128~127,根据转移目标地址为(PC)+2+2×OFFSET,若要向后转移,则要求OFFSET必须为负数,OFFSET的最小值为-128,但在执行转移指令之前,PC进行了自增+2的操作,所以向后最多可转移127条指令。 2)指令中C=0,Z=1,N=1,因此应根据ZF和NF的值来判断是否转移。CF=0,ZF=0,NF=1时,需转移。已知指令中的偏移量为11100011B=E3H,符号扩展后为FFE3H,左移一位(乘以2)后为FFC6H,因此PC的值(转移目标地址)为200CH+2+FFC6H=1FD4H。CF=1,ZF=0,NF=0时不转移。PC的值为200CH+2=200EH。 3)指令中的C、Z和N应分别设置为C=Z=1,N=0。两个数之间的大小比较通常是对两个数做减法运算,即两个数相减当结果为0或为负时转移,若为0,则ZF标志应当是1,若为负,则借位标志应该是1,而无符号数并不涉及符号标志NF。 4)部件①用于存放当前指令,不难得出为指令寄存器;多路选择器根据符号标志C/Z/N来决定下一条指令的地址是PC+2还是PC+2+2×OFFSET,因此多路选择器左边线上的结果应是PC+2+2×OFFSET。根据运算的先后顺序及与PC+2的连接,部件②用于左移一位实现乘以2,为移位寄存器。部件③用于PC+2和2×OFFSET相加,为加法器。 部件②:移位寄存器(用于左移一位);部件③:加法器(地址相加)。 05.【解答】 1)ALU的宽度为16位,ALU的宽度即ALU运算对象的宽度,通常与字长相同。地址线为20位,按字节编址,可寻址主存空间大小为2²⁰字节(或1MB)。指令寄存器有16位,和单条指令长度相同。MAR有20位,和地址线位数相同。MDR有8位,和数据线宽度相同。 2)R型格式的操作码有4位,最多有2⁴(或16)种操作。I型和J型格式的操作码有6位,因为它们的操作码部分重叠,所以共享这6位的操作码空间,且前6位全为0的编码已被R型格式占用,因此I和J型格式最多有2⁶-1=63种操作。从R型和I型格式的寄存器编号部分可知,只用2位对寄存器编码,因此通用寄存器最多有4个。 3)指令01B2H=0000001110110010B为一条R型指令,操作码0010表示有符号整数减法指令,其功能为R[3]←R[1]-R[2]。执行指令01B2H后,R[3]=B052H-0008H=B04AH,结果未溢出。指令01B3H=0000001110110111B,操作码0011表示有符号整数乘法指令,执行指令01B3H后,R[3]=R[1]×R[2]=B052H×0008H=8290H,B052H乘以8相当于将B052H算术左移3位,B052H是一个负数,符号位为1,在算术左移的过程中移出了101,不全为1,由此可以判断结果溢出。 4)在进行指令的转移时,既可能向前转移,又可能向后转移,偏移量是一个有符号整数,因此在地址计算时,应对imm进行符号扩展。 5)无条件转移指令可以采用J型格式,将target部分写入PC的低10位,完成转移。 4.3程序的机器级代码表示 考点追踪涉及汇编代码的年份(2012、2014、2015、2017、2019、2023、2024) 本节是2022年新增考点,但相关知识早已多次以综合题形式出现在历年真题中,难度较大,不少跨考生感到无从下手。通过本节学习后,考生应能从容应对此类问题。统考大纲未指定具体指令集,但历年真题主要考查x86和MIPS汇编指令。其中,MIPS指令通常会在试题中附带功能 172 2027年计算机组成原理考研复习指导 说明,而x86指令则更常作为默认考查对象。因此,本节重点介绍x86汇编指令。 4.3.1常用汇编指令介绍 1.相关寄存器 x86处理器中有8个32位通用寄存器,主要寄存器及说明如图4.11所示。为向后兼容早期的16位和8位架构,EAX、EBX、ECX和EDX的低16位可作为独立寄存器使用(分别记为AX、BX、CX、DX),而每个16位寄存器又可进一步拆分为两个8位寄存器(如AX分为AH和AL).其中,E表示Extended,用于标识32位寄存器。 通用寄存器 31 16 15 8 7 0 16bit 32bit 说明 AX EAX 累加器 (Accumulator) BX EBX 基地址寄存器 (Base Register) CX ECX 计数寄存器 (Count Register) DX EDX 数据寄存器 (Data Register) AH AL BH BL CH CL DH DL ESI EDI EBP ESP ESI 变址寄存器 (Index Register) EDI EBP 堆栈基指针 (Base Pointer) ESP 堆栈顶指针 (Stack Pointer) 图4.11 x86处理器中的主要寄存器及说明 除EBP(基址指针)和ESP(栈指针)外,其余通用寄存器的用途是比较灵活的。 2.常用指令 汇编指令通常可分为数据传送指令、算术与逻辑运算指令和控制流指令,下面以Intel格式为例,介绍一些常用指令。以下用于操作数的标记分别表示寄存器、内存和常数。 ·:表示任意寄存器,若其后带有数字,则指定其位数,如表示32位寄存器(eax,ebx, ecx, edx, esi, edi, esp或ebp); 表示16位寄存器(ax, bx, cx或dx) ; 表示8位寄存器 (ah,al,bh,bl,ch,cl,dh,dl) . ● : 表示内存地址(如[eax]、[var+4]或dword ptr[eax+ebx]). ● : 表示8位、16位或32位常数。表示8位常数;表示16位常数;表示32位常数。 考点追踪 分析汇编指令对应的二进制代码 (2010) x86指令采用变长编码,其操作码通常为1字节,但整条指令长度可变。同一指令(如mov)因操作数类型或寄存器不同,可能对应多种机器码编码,例如, mov ax, #机器码为B8H mov al, #机器码为BOH mov , / #机器码为89H mov /, #机器码为8AH mov /, #机器码为8BH 考点追踪 模仿写出简单语句的机器级指令 (2012) (1)数据传送指令 1)mov指令。将第二个操作数(寄存器内容、内存内容或常数值)复制到第一个操作数(寄存器或内存)。其语法如下: mov < reg>,< reg> 第4章指令系统 173 mov < reg>,< mem> mov < mem>,< reg> mov < reg>,< con> mov < mem>,< con> 举例: mov eax, ebx #将 ebx寄存器的值复制到 eax mov byte ptr [var], 5 #将常数5存入地址 var处的1字节内存单元 双操作数指令的两个操作数不能同时为内存,即mov指令不能用于直接从内存复制到内存。若需在内存之间复制,可先将源内存内容加载到寄存器,再从该寄存器写入目标内存。 2) push指令。将操作数压入栈中,常用于函数调用和现场保护。ESP是栈顶,入栈前先将ESP减4(栈向低地址方向增长),再将操作数压入ESP所指地址。其语法如下: push < reg32> push < mem> push < con32> 举例(注意,栈中元素固定为32位): push eax #将 eax的值压入栈 push [var] #将地址 var处的4字节内容压入栈 3) pop指令。与 push指令相反,从栈中弹出数据。出栈前先将ESP所指地址的内容读出,再将ESP加4。其语法如下: pop eax #弹出栈顶元素并存入 eax pop [ebx] #弹出栈顶元素并存入 ebx所指的4字节内存地址 (2)算术和逻辑运算指令 1) add/sub指令。add指令将两个操作数相加,sub指令将第一个操作数减去第二个操作数,结果均保存在第一个操作数中。其语法如下: add < reg>,< reg>/ sub < reg>,< reg> add < reg>,< mem>/ sub < reg>,< mem> add < mem>,< reg>/ sub < mem>,< reg> add < reg>,< con>/ sub < reg>,< con> add < mem>,< con>/ sub < mem>,< con> 举例: sub eax, 10 #eax←eax-10 add byte ptr [var], 10 #将地址 var处的1字节内容与10相加,结果存回该地址 2) inc/dec指令。分别对操作数执行自增1或自减1操作。其语法如下: inc < reg> / dec < reg> inc < mem> / dec < mem> 举例: dec eax #eax值自减1 inc dword ptr [var] #将地址 var处的4字节内容自增1 3) imul指令。有符号整数乘法指令,支持两种格式:①双操作数,将第二、第三操作数相乘,结果存入第一个操作数(必须为寄存器);②三操作数,将第二、第三操作数相乘,结果存入第一个操作数(必须为寄存器)。其语法如下: imul < reg32>,< reg32> imul < reg32>,< mem> imul < reg32>,< reg32>,< con> imul < reg32>,< mem>,< con> 举例: imul eax, [var] #eax←eax * [var] imul esi, edi, 25 #esi←edi * 25 无符号整数乘法由 mul指令实现,仅支持单操作数格式,被乘数隐含在 eax中,乘积结果存放在edx:eax中。当edx≠0时,表示结果无法用32位无符号数表示,CPU置CF=1和OF=1。imul 174 2027年计算机组成原理考研复习指导 在结果溢出时,同样置CF=1和OF=1。无符号乘法以CF判断溢出,有符号乘法则以OF为准。 4)idiv指令。有符号整数除法指令,仅指定除数。被除数为edx:eax组成的64位有符号数(edx为高32位,eax为低32位)。执行后,商存入eax,余数存入edx。其语法如下: idiv idiv 举例: idiv ebx idiv word ptr[var] 无符号整数除法指令div的格式与idiv的完全一致,仅对操作数的解释不同。 5)and/or/xor指令。分别执行按位与、或、异或操作,结果存入第一个操作数。其语法如下: and,/or,/xor, and,/or,/xor, and,/or,/xor, and,/or,/xor, and,/or,/xor, 举例: and eax,0FH #将eax的高28位置0,低4位保持不变 xor edx, edx #将edx清零 6)not指令。按位取反指令,将操作数的每一位0变1、1变0。其语法如下: not not 举例: not byte ptr[var] #将地址var处的1字节内容按位取反 7)neg指令。取负指令,计算操作数的二进制补码(-x)。其语法如下: neg neg 举例: neg eax #eax←-eax 8)sh1/shr指令。逻辑移位指令:sh1为逻辑左移,shr为逻辑右移,第一个操作数为被移位数,第二个操作数为移位位数。其语法如下: sh1,/shr, sh1,/shr, sh1,/shr, sh1,/shr, 举例: sh1eax,1 #eax逻辑左移1位 shrewbx,cl #ebx逻辑右移n位(n为cl中的值) (3)控制流指令 x86处理器通过指令指针寄存器EIP(相当于程序计数器即PC)指示当前执行指令的地址。每条指令执行后,EIP自动指向下一条指令。EIP不能直接访问,但可通过控制流指令修改。程序中常用标签(label)标记指令地址,例如: 指令① begin: 指令② 指令③ 此处标签begin指向第二条指令,控制流指令通过标签实现转移。 考点追踪 无条件转移指令的指令格式(2021) 1)jmp指令。无条件转移到label标签所指示的地址继续执行。其语法如下: jmp