简介:《计算机系统概论(原书第二版)》第一章习题答案以 PDF 文件形式整理了教材配套的精选解答,面向正在学习计算机系统原理的本科生、考研复习者或自学者,用于课后自测、解题思路对照与概念巩固。压缩包内只有 1 个 PDF 文件,共 33KB,轻量易用,适合下载到电脑或手机随时查阅。
内容覆盖第一章多个重要知识点:计算机的通用性与冯·诺依曼架构、模拟与数字系统在精度上的差异、逻辑电路与加法器/乘法器的组合设计、性能优化中的取舍思维,以及高级语言相对低级语言的抽象优势。解答采用英文原版 Selected Solutions 的呈现方式,每道题都给出简明结论与必要推导,比如通过逻辑门组合计算 ax+b、求四个数的平均值、分解 (a+b)^2 等,方便读者对照教材原文逐项理解。
目前已有 720 人学习下载,搭配纸质教材或课程进度使用,能帮助初学者在作业遇到困难时快速定位思路,夯实第一章概念后再进入后续章节。
1. 计算机系统概论(原书第二版)习题答案第一章:为什么这份答案值得自己推一遍
“计算机系统概论(原书第二版)习题答案第一章”是个检索量不小的词,可多数人点进来并不是想让知识点过脑,而是想让作业快点“有答案”。我的建议恰恰相反:第一章内容不负责难住你,它负责把“程序到指令再到硬件”这条链路在你脑子里建立起来,参考答案只是最后一步的校验信号。
搜这个词的人通常是三类:正在上一门系统类课程、跨考补基础、自学翻到第一章。前两类人的问题往往不在“算不出”,而在“不会组织答案”——概念背过但下笔不成句,计算能蒙对但说不清步骤。第三类更容易踩坑,因为第一章概念零散、题型不统一,特别容易陷入“只比对答案、不还原推导过程”的怪圈。
下面按“先补概念,再推题型,再排查易错点”的顺序讲。目标不是替你完成作业,而是让你看完后能流畅说出“这类题为什么这么解”。这比答案本身值钱,因为后续几章全是建立在这些概念上的。
2. 先补齐概念再对答案:寄存器、字长与指令周期的答题地基
第一章习题无论哪个教材版本,基本逃不出三类:概念解释、小计算、流程描述。与其逐题抄,不如先把这三类背后的概念钉死。概念不确定时做的计算,错得最隐蔽——数字看起来都对,逻辑却经不起追问。
2.1 寄存器与存储单元的差别:概念题的标准答法
第一章最爱考“寄存器”和“存储单元(主存)”的区分。很多人背过“寄存器快、存储单元慢”,但题目换个问法就答不全。
寄存器在 CPU 内部,访问时不需要给出地址,而是用寄存器名直接选通;主存存储单元在 CPU 外部,必须给出地址才能读写。一个适合答题的句式是:
寄存器是 CPU 内部按名字访问的高速度临时存储位置;存储单元是主存中按地址访问的数据位置,容量远大于寄存器组。
如果题目进一步问“寄存器为什么比主存快”,答案要落到物理位置和访问机制上:寄存器选通路径短,和运算部件在同一片硅片上;主存要经历地址译码、行/列选通、数据总线传输,路径长且受总线宽度限制。
这类概念题常见的扣分点是不写“按什么方式访问”。只说“快很多”不算完整答案,必须点出“按名字访问”和“按地址访问”这个本质区别。另一个坑是把“存储单元”混成“存储元件”。某些教材中“存储单元”指能存一位二进制位的电路,也可能指一个编址单位,这两种定义都出现过。答题前先确认你用的教材管哪一层叫“存储单元”,否则和参考答案对不上是必然的。
2.2 地址总线、数据总线与字长:小计算题的三个关键量
涉及总线宽度和存储空间的题目,第一章几乎每套都有。三个量必须分开理解:
- 地址总线宽度决定能区分多少个地址,而不是一次能传多少数据。
- 数据总线宽度决定一次访存能并行传输多少位。
- 字长是运算器、寄存器和系统总路线上的“标准位宽”,一般指一次整数运算能处理的位数。
可寻址空间的计算模板是:
可寻址单元数 = 2^(地址线数目) 最大可寻址容量 = 可寻址单元数 × 编址单位位数注意“编址单位”绝大多数教材按字节编址,也就是 8 位一个地址。有些机算机会按字编址,那样容量公式里的编址单位就是字长。答题时先把“按字节编址”或“按字编址”写明,这一句话能避免后面所有数字算错。
数据总线宽度不决定地址空间。很多同学看到数据总线 64 位,就顺手把容量也算成 64 位,这是常见翻车点。正确关系是:数据总线影响一次读写的数据量,而可寻址范围由地址线决定。比如地址线 32 条、按字节编址,可寻址 2^32 字节;数据线 64 位只是说明一次能读 8 字节,并不改变地址数量。
2.3 指令周期四步法:流程类题目答得完整的关键
流程类习题常问“一条指令从开始到结束经历了哪些过程”。通常的标准回答围绕四个阶段组织:
- 取指:程序计数器给出下一条指令地址,控制器把指令取到指令寄存器。
- 译码:指令寄存器中的操作码被解析,决定需要哪些操作数。
- 取操作数:按地址从寄存器或主存中读出参与运算的数据。
- 执行:运算器完成操作,必要时把结果写回寄存器或主存。
不同教材会把这四步拆得更细,比如把“回写”单独列成第五步,或者把“地址计算”并入取操作数。答题技巧是写明“至少包含以下阶段”,然后按你教材的顺序排列。不会错,因为“至少包含”给自己留了余地。
很多简答题只写“取指、执行”两个词,分数必然低。要把每个阶段“涉及哪个部件、产生什么结果”写出来。常见答题句:
取指阶段由程序计数器提供地址,从主存读出指令并放入指令寄存器;执行阶段由运算器根据操作码完成运算,结果经数据总线写回。
2.4 概念到句式对照表:把记忆点变成能下笔的句子
| 考点 | 答题句式 | 易错点 |
|---|---|---|
| 总线 | 一组共享的传输通道,分为地址总线、数据总线、控制总线 | 只说“传输数据”,漏掉地址和控制线 |
| 寄存器 | CPU 内部按名字访问的临时存储位置 | 写成“有地址” |
| 程序计数器 | 存放下一条指令地址的寄存器 | 混成“当前正在执行指令的地址” |
| 指令周期 | 从取指到执行完成所需的全部时间 | 只写一个“执行” |
| 补码 | 正数原码不变,负数按位取反再加一 | 忘掉符号位参与扩展 |
对着这张表做题时,先看题目是“解释术语”还是“对比概念”。解释术语题把表中句式展开即可;对比题则要额外写一句“二者的本质差别是……”。很多答案差的不是知识,是缺了这句总结性差异。
3. 手把手推第一章三类典型题:进制、真值表、指令流程
概念地基打好后,开始做题。这里不按题号顺序,而是按题型来。第一章大题的出题方式相对固定,能把下面三类题各推熟一份,大部分作业都能覆盖。
3.1 进制与补码题:一位位推完,再用脚本复核
进制题是第一章的计算主力,常见要求是十进制转二进制、八进制、十六进制,以及求补码。以“求十进制数 -47 的 8 位补码”为例,标准推导步骤是:
- 取绝对值 47,写成 8 位二进制:00101111。
- 按位取反:11010000。
- 加 1:11010001。
- 校验:11010001 取反加一应该回到 00101111,符号位为 1,说明是负数。
这个过程不复杂,但手算容易在某一位上进位出错。我习惯在完成每道手算题后用一个短脚本复核:
def twos_complement_bits(value: int, width: int = 8) -> str: mask = (1 << width) - 1 bits = value & mask return f"{bits:0{width}b}" # 验证 -47 的 8 位补码 print(twos_complement_bits(-47, 8)) # 预期输出 11010001这段代码的原理是用按位与操作模拟固定位宽的截断。mask = (1 << width) - 1生成 8 位的全 1 掩码,负数与掩码做与运算后,Python 的无限精度整数会被强制截断成低 8 位。f"{bits:0{width}b}"负责补齐前导零。
参数说明:value是要转换的十进制整数,attention width 必须与题目要求的编码位宽一致。如果题目问 16 位补码,就传width=16。脚本只作复核,不建议直接替代手算过程——考试时不能跑代码,答题步骤必须能独立写出来。
边界情况值得单列:-128 的 8 位补码是 10000000,这是最小负数;127 的补码是 01111111,最大正数。-128 取反加一时会溢出到 10000000,初看像没变化,其实正确。遇到这类结果别急着“修正”,先想想范围。
3.2 真值表与逻辑表达式题:从文字条件到完备枚举
另一类常见题是给定逻辑条件写真值表,或反过来给真值表写表达式。以“输入为 a 和 b,仅当 a=1 且 b=0 时输出 1”为例,做题顺序是:
- 数清楚输入数量(2 个),因此有 2^2 = 4 行。
- 按 a、b 二进制升序列举:00、01、10、11。
- 逐行对照条件填写输出:10 那行输出 1,其余行输出 0。
- 按输出为 1 的行写表达式:a 为 1、b 为 0,所以 a AND (NOT b)。
# 用枚举验证真值表完备性 for a in [0, 1]: for b in [0, 1]: f = a & (1 ^ b) # a AND NOT b print(f"a={a} b={b} -> f={f}")这里1 ^ b实现了逻辑非,效果和not b一致,但返回 0/1 整数,方便和&混用。参数说明:两层循环覆盖所有输入组合,输出 4 行数据,与手写真值表逐一对照,可以有效发现“漏列组合”或“逻辑写反”的问题。
写表达式时注意优先级。a & (1 ^ b)的括号不能省略,否则容易误看成(a & 1) ^ b,两者真值表完全不同。第一章考试里最常见的就是这种差一对括号、整张表全错的低级错误。写完表达式后,把四行输入再代一遍,不要只看输出为 1 的行,输出为 0 的行同样能暴露问题。
3.3 指令流程题:按阶段组织答案,避免漏步骤
“简述一条指令的执行过程”是简答题里的常青树。答法要结构化,不能写成一段散文。我把答题模板拆成四行:
| 阶段 | 涉及部件 | 必要动作 | 结果 |
|---|---|---|---|
| 取指 | 程序计数器、主存、指令寄存器 | 送出地址,读出指令 | 指令落入指令寄存器 |
| 译码 | 控制器/译码器 | 识别操作码,生成控制信号 | 明确操作类型 |
| 取操作数 | 寄存器堆、主存 | 按寻址方式读取源数据 | 数据就绪 |
| 执行 | 运算器 | 完成运算,写回结果 | 结果更新寄存器或主存 |
答题时按表格展开成段落,每阶段写一句“动作 + 结果”。比如:
取指阶段由程序计数器生成地址并送到地址总线,主存按该地址读出指令经数据总线送至指令寄存器,随后程序计数器按指令长度自增或跳转。
注意程序计数器的变化逻辑:顺序执行时加指令长度,分支跳转时改成目标地址。很多教程只写“自增”,忽略了跳转情况。第一章若讲到分支指令,务必补上“按指令要求修改”这个说法。
如果题目还要求“说明控制器与运算器的分工”,就从“控制 vs 计算”来答:控制器发控制信号调度每一步,运算器实际执行加减和逻辑操作。别写“CPU 统一处理”,这种大而化之的表述得不了分。
4. 第一章习题答案排查:五个高频翻车点与修正方法
这一章专门讲对照答案时怎么排查。你做完题发现和参考答案对不上,多数不是因为你没背概念,而是下面五个坑里至少踩了一个。每条按“现象 → 原因 → 解决”来写,可以直接当检查清单用。
4.1 现象:补码边界值看着不对,怀疑参考答案有问题
经常有人算到 -128 的 8 位补码就卡住。手算结果是 10000000,取反加一之后还是 10000000,怎么验都“没变化”,于是认为自己算错,跑去改答案。实际上这是边界值的正常现象。
原因:-128 的补码在 8 位表示中已经是表示范围的最左侧端点,对它取反加一刚好回到自身。这等价于数学上的溢出回绕,不是错误。类似地,-1 的 8 位补码是 11111111,如果把它当成“原码”解释,会得到 -127,造成混乱。
解决:判断补码结果始终用“符号位为 1 表示负数”和“取反加一回到绝对值”两个规则复核。边界值特殊,建议单独记忆:最小负数的补码永远是 1000…0,最大正数是 0111…1,-1 是全 1。这三个特例记住后,边界题不会再翻车。
4.2 现象:十六进制转二进制后字节序不对
题目要求把十六进制数写成二进制,或者把多字节数据按内存地址排列。常见的错误是手算时从右往左拆,结果低位字节在前还是高位字节在前搞反。
原因:十六进制转二进制本身没错,错在题目隐含的大小端要求。比如一个 16 位数据 0x12A4,按大端在主存中先存高字节 12,再存低字节 A4;按小端则反过来。有些习题插图中画了内存地址递增方向,你不看地址就排字节序,必然对不上。
解决:做题时先在草稿纸上标注“地址递增方向”,再标“大端/小端”。题目没提时,默认按教材约定。回答时把“按大端排列为……”这句话写清楚,即使教材约定不同,老师也能看出你理解了两个概念的分界。
4.3 现象:可寻址空间与存储容量混为一谈
计算题问“这块主存有多大”,你算出的数字和参考答案差 8 倍或更多,常发生在“按字节编址”和“按字编址”之间。
原因:可寻址空间等于“地址数量”,存储容量等于“地址数量 × 每个地址的数据宽度”。地址数量由地址线宽度决定,每个地址对应多少位由编址单位决定。题目说地址线 16 条、按字编址、字长 16 位,可寻址 2^16 个字,容量就是 2^16 × 16 位。把“2^16 个字”直接当成“2^16 字节”就差了。
解决:答题时统一写成两步:
地址数量 = 2^16 = 65536 容量 = 65536 × 16 位 = 131072 位 = 16 KB关键是最后一步换算写清楚:8 位为 1 字节,所以 131072 位除以 8 才是字节数。看到参考单位是 KB 还是 KB 字,先换算成同一种单位再比较。
4.4 现象:简答题写了一大段,分数还是低
题干问“简述寄存器和主存的区别”,你写了二三百字,结果参考答案只有四五行,分数却不理想。原因通常不是内容少,而是没有踩中给分点。
原因:评分标准看“寄存器按名字访问、主存按地址访问”这类对比核心,以及“速度、容量、位置”三个维度。长篇大论若没有明确点出对比关系,老师很难给分。
解决:把答案改成两段式。第一句直接下结论:“二者本质区别是访问方式不同。”第二句展开三个对比维度:速度、容量、位置。最后一句回到题目语境:“因此程序频繁使用的临时数据放在寄存器,大量数据放在主存。”这种结构覆盖了所有常见给分点。
4.5 现象:真值表输出列与参考答案全错位
自己画的真值表行数和参考答案一样,但输出列错位严重,从某一行起全反了。
原因:输入列举顺序不一致。你按 a 高位、b 低位的顺序列 00、01、10、11,参考答案可能按 b 高位、a 低位排列,或者行顺序用了格雷码顺序。
解决:写真值表前先确定输入变量顺序。建议固定为“第一个变量作为最高位,按二进制递增列举”。如果参考答案顺序不同,不要直接抄输出列,而是先按自己顺序重算一遍,再对照逻辑结果是否一致。逻辑结果相同时,行顺序不同不影响正确性,只要标注清楚变量顺序即可。
5. 用自测表闭环验证答案:范围、一致性与边界三遍检查
对照完参考答案,别急着合上书。解决实际问题时,验证是不可略过的一步;对学生来说,把做完的题放进一套检查流程,效果比再刷十道题更明显。这一节给一套可复用的自测方法。
5.1 一张自测表:逐题记录考点、差异与回看项
做完全章习题后,我习惯拉一张自测表,把每道题的关键信息落到表格里:
| 题号 | 考点 | 我的答案核心 | 与参考答案差异 | 差异原因 | 需要回看的概念 |
|---|---|---|---|---|---|
| 1 | 补码转换 | 11010001 | 无 | - | 补码规则 |
| 2 | 地址空间 | 直接写 2^16 | 少写编址单位 | 漏了按字节编址 | 总线与编址 |
表格填完,答案检查就从“感觉差不多”变成“逐项可查”。差异原因一栏不要写“算错”,要写具体现象:“符号位未扩展”“漏了取操作数阶段”。写具体,回看时才有针对性。
5.2 第一遍检查:范围检查,看有没有漏子问题
范围检查解决的是“题目有三问,你只答了一问半”的漏题问题。第一章习题的题干有时藏得深:问“该 CPU 可寻址空间多大”,后面半句还跟着“若改为按字编址,容量变为多少?”你只答第一问,第二种情况没写,扣分很冤枉。
做法是逐字圈题干,找出所有“若”“分别”“并说明理由”这类词。每一处都是独立的得分点。填自测表时,把每个子问题拆成一行记录。这样不会漏。
5.3 第二遍与第三遍检查:一致性与边界检查
一致性检查针对论述题。看你的答案内部有没有自相矛盾。比如前面写“取指阶段由程序计数器提供地址”,后面却说“程序计数器在译码阶段更新”,两句话虽然各说各的,但放在一起就暴露了时序理解混乱。正确做法是把指令周期各阶段按时间顺序核对一遍,每个阶段只做一件事,动作不重叠。
边界检查针对计算题。设计几个边界值代回题目:地址线全 1、数据全 0、补码最小值、真值表全输入组合。边界值通过不代表全对,但边界值出错一定有问题。比如补码题把宽度从 8 位改成 16 位,符号扩展是否一致,这是第一章最容易漏的边界条件。
5.4 差异归类:把“对不上答案”变成下次能避开的坑
做完前面两遍检查,剩下的差异分成两类:知识盲区和技术性失误。知识盲区需要回看书本概念,重新写一遍该题的完整推导;技术性失误则记录成“下次先检查符号位、先列变量顺序”这类行为清单。
我自己带过的一个经验:每章准备一个“翻车记录”,只记现象和原因,不记完整答案。复习时扫一眼记录,就知道哪些地方要格外小心。这比把错题整个抄一遍更高效,因为重看完整冗长的题目会分散注意力。
6. 进阶:把第一章答案改编成一道题的三种问法
这套题做完、检查过后,还有一个我自己觉得很有效的收尾动作:把同一道题改写成三种问法,再分别回答。
以“补码”为例。原题常见问法是“求 -47 的 8 位补码”,这是纯计算。把它改成概念题:“补码和原码的区别是什么,为什么用补码表示负数?”再改成流程题:“简述用补码做减法时,运算器需要经历哪些步骤?”三个问题指向同一个知识点,但答题逻辑完全不同。能三问都答顺,这个考点才算真正拿下。
这样做的好处是,第一章很多题如果你只会一种答法,换个题型就懵。比如真值表题改成“给出逻辑表达式画出电路图”,指令周期题改成“某个阶段出错会导致什么后果”,都需要在不同抽象层次之间切换。用“反向出题”的方式逼自己站在出题者角度想问题,比一遍遍重复刷题更容易暴露理解缺口。
我现在仍然保留这个习惯——每学完一章,挑三个最重要的知识点各出三道变体题,不写答案,隔天再做并核对。费时不多,但效果比多做十道重复题更稳。第一章是后面所有章节的地基,在这里多花半小时,到存储器分层、指令流水线、I/O 子系统时就能少走很多弯路。希望帮到你。
本文还有配套的精品资源,点击获取