ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

计算机组成原理第2章习题精讲:进制转换、补码与浮点运算解题路径

计算机组成原理第2章习题精讲:进制转换、补码与浮点运算解题路径 第2章的课后习题是我这几年帮学弟学妹答疑时见得最多的一章。不是因为它最难恰恰相反它常常是最看起来简单的一章进制转换、原码反码补码、浮点数表示这些名词在中学信息课或者编程入门里都听过一耳朵于是很多人扫一眼课本就觉得自己会了提笔就对结果一对答案错掉小一半。计算机组成原理这门课有个很特别的地方第2章是整本书里极少数同时考记忆准确性和手算功底的章节它不像后面讲存储系统、指令系统那样可以靠理解框架蒙过去这一章的每一个答案都是硬算出来的符号位错一位、阶码多移位一次整道题的分就没了。这篇内容我想干的事很明确把《计算机组成原理微课版》第2章课后习题里那些反复出现、反复被做错的题型拆成一条能照着走的解题路径。它面向的是正在赶作业的在校生、准备期末的复习党也包括那些跨专业自学、手里只有一本教材和零散答案的人。我不会给你一份干巴巴的答案清单那种东西你网上随便一搜就有而且经常是错的我要做的是把每一类题背后的判定规则、验算方法、易错位置讲透让你下次遇到同类题能自己推、自己验而不用赌记忆。1. 第2章习题的底层逻辑先搞清楚它在考什么很多人做第2章习题的姿势是错的翻开作业从头一道一道往下做遇到不会的就翻书找公式。这种打法在这一章效率极低因为第2章的题目看着五花八门实际上翻来覆去就围绕三件事——怎么表示一个数、怎么算两个数、怎么判断算出来的结果对不对。把这三件事的规则先在心里串成一条线再回头看那些题目你会发现它们其实是同一套动作的不同变体。1.1 第2章的知识地图与题型分布不同版本的微课版教材第2章标题略有差异常见的叫法是运算方法和运算器或者数据的表示和运算但内容骨架高度一致。我把它整理成一张表你对着自己的课本目录核一下基本能对上号。知识模块核心概念习题常见形态数制转换二/八/十/十六进制互转十进制小数转二进制、十六进制展开机器数表示原码、反码、补码、移码求真值的四种机器数、求相反数定点数运算补码加减、移位补码加法、算术/逻辑移位溢出判断单符号位、双符号位、进位法判断结果是否溢出、写出变形补码浮点表示IEEE 754、阶码尾数十进制转浮点、浮点还原真值浮点运算对阶、规格化、舍入浮点加减求结果乘除运算原码/补码一位乘、除法写出部分积过程进位逻辑组内并行、组间串行/并行计算加法器进位延迟这张表的意义在于你做的每一道课后题都能被归到某一格或者相邻两格的组合里。判断出这道题属于哪一格你脑子里对应的那套规则就该自动弹出来而不是临时去想公式。1.2 做这一章习题必须先建立的三个思维习惯第一个习惯是位数意识。第2章的题几乎都带位数约束比如用8位表示设字长16位。位数不是装饰它直接决定答案。补码求相反数的规则是按位取反末位加一但如果你忘了这是在固定字长下进行的最高位就会处理错。我见过太多人在8位题里算出9位的结果自己还觉得挺对。第二个习惯是符号位单独看待。无论是定点数还是浮点数符号位永远是最容易错的地方。定点数里符号位参与运算但不参与进位判断浮点数里符号位干脆独立出来只影响最终正负。你要养成一个动作动笔第一件事先把符号位标出来算完再回头确认符号对不对。第三个习惯是结果反验。第2章的题有一个巨大的好处——绝大多数答案都能验算。补码算完可以用真值回代浮点数编码完可以按公式还原溢出判断可以用两种方法互相印证。养成反验习惯你在考场上就能自己抓出大部分错误这比任何技巧都管用。2. 进制转换与机器数表示看着送分实则暗坑密布这一块是第2章习题的开场白通常占的分值不低而且极易拉开差距。原因很简单它考的不是智商是熟练度和细心程度。进制转换错一位、补码符号位写反都是那种我明明会的失分。2.1 进制转换的通用套路与快速验算十进制整数转二进制用除2取余、逆序排列小数转二进制用乘2取整、顺序排列这两句口诀都会背但真正做题时出错往往出在两头整数部分和小数部分要不要拼在一起、拼的顺序对不对。拿一道典型题把十进制数 45.25 转成二进制。整数部分 4545 ÷ 2 22 余 122 ÷ 2 11 余 011 ÷ 2 5 余 15 ÷ 2 2 余 12 ÷ 2 1 余 01 ÷ 2 0 余 1。余数逆序读上来就是 101101。小数部分 0.250.25 × 2 0.5 取整 00.5 × 2 1.0 取整 1。取整顺序读下来就是 .01。拼起来答案 101101.01。注意小数部分转二进制时如果乘下去永远到不了整数比如0.1题目通常会要求保留n位小数。这时候规则是乘到第n位为止末位按四舍五入处理或者题目直接指定截断。别自己凭感觉停严格按题目要求。验算的方法很实用把结果按权重展开回去。101101.01 32841 0.25 45.25对上了。这个展开回代动作只需十几秒却能拦下90%的换算错误。十六进制和二进制之间的转换是最快的四位一组直接对1011 0101 B5十六进制。这种四位对齐的技巧在写机器码、看内存地址时用得极多建议练到条件反射。2.2 原码、反码、补码、移码一张表锁死所有转换机器数表示是第2章的重灾区也是后面所有运算的基础。我建议你把这四种编码的规则用一句话记牢然后再看表对照。原码最高位是符号位0正1负其余位是真值的绝对值。反码正数与原码相同负数在原码基础上符号位不变、数值位按位取反。补码正数与原码相同负数在反码基础上末位加一。移码补码的符号位取反常用于浮点数阶码。以8位、真值 -45 为例逐步推编码计算过程8位结果原码符号1 45的7位二进制010110110101101反码10101101数值位取反符号不变11010010补码反码末位加一11010011移码补码符号位取反01010011这里有个非常好用的速算公式负数的补码等于2的n次方减去该数的绝对值n是字长。上面的例子256 - 45 211211的二进制就是11010011和逐位推导的结果一致。考场上用这个公式又快又不容易错。再补一个高频小题已知[x]补 11010011求[-x]补。做法是连同符号位一起按位取反末位加一得到00101101。你可以验证一下x此时是 -45那 -x 就是 45正数的补码就是00101101确实是这个数。实操心得求相反数补码时连同符号位一起取反加一这个动作要一次做对别分两步在心里绕。很多人先取反再忘了加一或者符号位单独处理导致出错。我的做法是固定口诀——全部取反、末尾加一、一步到位。2.3 真值与机器数互转时最容易翻车的三个点第一个点是数值位不够补零的位置。比如用16位表示 -45你不能直接拿8位的11010011顶上正确做法是先写16位的原码1 0000000 00101101也就是1000000000101101。位数一变所有结论都要重算。第二个点是补码1000...0这个特殊数。在8位补码里10000000表示的不是 -0补码里没有负零而是 -128。这个数是补码能表示的最小负数很多题目专门考它。判断一个补码对应的真值别只会减一取反要记得这个边界。第三个点是移码的作用。移码最大的特点是能让所有数的编码保持大小顺序一致所以浮点数的阶码用移码表示比较两个浮点数阶码大小时直接比编码就行。这个为什么用移码的思路期末简答题里出现过。3. 定点数运算与溢出判断加法器藏着的学问如果说进制转换是热身那定点数运算就是第2章的正面战场。这一块的题目通常要求你写出运算过程、判断溢出分值重、步骤多是拉分的关键。3.1 补码加减法为什么要变减为加先回答一个很多人没想明白的问题计算机里为什么都用补码做加减而不是原码答案在于硬件成本。用原码做减法需要单独设计一套减法电路还要处理符号判断用补码减一个数等于加它的补码加法和减法共用同一个加法器电路大幅简化。这就是补码存在的根本理由也是简答题的常见答案。计算规则很直接两数补码相加符号位一起参与运算结果仍为补码。举个例子设字长5位1位符号4位数值求 x 0.1011 与 y -0.1101 的和。[x]补 0.1011[y]补 1.0011-0.1101先写原码1.1101取反得1.0010加一得1.0011。相加0.1011 1.0011 --------- 1.1110结果补码1.1110对应真值是 -0.0010。验算0.1011 - 0.1101 -0.0010正确。注意事项补码加法里最高位的进位要自然丢弃不要当作溢出。这是新手最常困惑的地方——明明产生了进位怎么还说不溢出记住那个进位是模运算的结果扔掉就对了判断溢出另有方法见下一节。3.2 溢出判断的三种方法及其适用场景溢出是定点数运算的核心考点教材一般给三种判断方法很多人背了但不会用。我把它们和适用场景讲清楚。方法一单符号位法。两个同号数相加如果结果的符号与它们相反就溢出。正正得负、负负得正都是溢出。这个方法最快适合快速判断但缺点是在结果里看不出来溢出本身。方法二双符号位法变形补码。用两位符号位表示正数00负数11运算后看结果的高位符号00正常、11正常、01正溢出、10负溢出。这个方法的好处是符号位本身携带了溢出信息结果00和11都正常01和10直接报溢出。方法三进位判断法。最高数值位的进位和符号位的进位两者相同则不溢出不同则溢出。用异或描述就是符号位进位 XOR 最高数值位进位 1 时溢出。用一道题串起来设 x 0.1011y 0.1101用双符号位法判断溢出。[x]补 00.1011[y]补 00.1101。00.1011 00.1101 --------- 01.1000结果高位符号是01正溢出。用进位法验证最高数值位从右往左第四位相加产生了进位符号位相加没有进位两者不同判定溢出两种方法结论一致。判断方法判溢条件优点局限单符号位同号相加结果异号最快不记录溢出信息双符号位高位符号为01或10结果自带溢出标志需多用一位进位法符号进位⊕数值最高位进位1硬件直接可用需关注两个进位3.3 移位运算算术移位和逻辑移位的分水岭移位分两种逻辑移位不管符号位全体现数据一起移空位补0算术移位要保持符号位不变只移数值位空位怎么补取决于编码方式。算术右移的空位补充规则我总结成一句话原码补0补码补符号反码补符号。也就是说正数算术右移补0负数补码算术右移补1因为它的数值部分本身是补码形式负数反码算术右移补1。举个例子[x]补 1.0100这是负数算术右移一位符号位1保持数值位右移空出的高位补1得到1.1010。而如果做逻辑右移则整体右移、最高位补0得到0.1010符号就变了这显然不是算术运算想要的。关键区分移位操作要不要照顾符号取决于你这道题是逻辑操作还是算术操作。题目写算术右移就保符号写逻辑右移就不保。看到右移两个字先找形容词这一个字的差别决定了整道题的对错。4. 浮点数表示与IEEE 754大题集中营浮点数这块是第2章最容易出大题的地方因为它步骤多、计算复杂老师喜欢用它来区分层次。好消息是它的规则非常固定只要按流程走几乎不会翻车。4.1 IEEE 754单精度格式的拆解与编码32位单精度浮点数的结构是1位符号 8位阶码 23位尾数。阶码用移码表示偏移量是127尾数用原码表示而且规定规格化后整数部分恒为1这一位被隐藏起来不写所以实际有24位有效精度。把十进制数 -0.75 编成32位浮点格式按流程走第一步把 -0.75 转成二进制。-0.75 -0.11写成规格化形式就是 -1.1 × 2⁻¹。第二步符号位。负数符号位取1。第三步阶码。真实阶码是 -1加上偏移量127得126转8位二进制是01111110。第四步尾数。规格化后是1.1隐藏整数部分的1剩下尾数是1后面补0到23位10000000000000000000000。拼起来1 01111110 10000000000000000000000写成十六进制就是 BF400000。验算时反着来BF400000符号位1是负阶码01111110是126126 - 127 -1尾数还原成1.1最终值 -1.1 × 2⁻¹ -0.75正确。字段位数本例取值含义符号位11负数阶码801111110真值-1加偏移127尾数23100...0隐藏整数1后的1.14.2 浮点数加减运算的五步法浮点数加减是本章的压轴菜标准步骤是对阶、尾数加减、规格化、舍入、判断溢出。每一步都有讲究我逐个说。对阶是第一步原则是小阶向大阶看齐也就是把小阶的数的尾数右移直到两数阶码相等。为什么是小阶向大阶看齐而不是大阶向小阶因为尾数右移会丢失低位移得越少精度损失越小小阶数右移的位数正好等于阶差是最小代价的调整方式。举个例子x 0.1101 × 2⁰¹y -0.1010 × 2¹¹阶码用补码表示。对阶x的阶码01y的阶码11阶差为2。把x的尾数右移2位0.1101 → 0.0011末位有丢失阶码调整为11。尾数加减0.0011 (-0.1010) -0.0111。规格化结果尾数首位与符号位相同就需要继续调整。-0.0111 × 2¹¹ 不是规格化形式规格化要求尾数绝对值≥0.5即首位为1。把尾数左移一位变成 -0.1110同时阶码减一变成10。最终结果 -0.1110 × 2¹⁰。实战提醒对阶时尾数右移低位会移出去这些位不能直接扔题目要求精度时要考虑舍入。如果题目没说通常按截断处理但你自己心里要清楚丢了什么简答题里问为什么会产生误差就答对阶右移和末位舍入造成精度损失。4.3 规格化、舍入与溢出三个收尾动作别漏规格化分左规和右规。尾数运算后如果首位与符号位不同说明尾数过大需要右移一位、阶码加一这叫右规如果尾数首位与符号位相同对补码而言是出现了冗余符号位说明尾数太小需要左移、阶码减一这叫左规。判断方向别搞反。舍入有几种策略常见的包括就近舍入四舍五入朝零舍入截断朝无穷舍入等。IEEE 754默认就近舍入。考试时按题目指定没指定就用截断但要在答案里注明。溢出判断的是阶码阶码上溢说明结果太大机器报溢出阶码下溢说明结果太小趋近于零机器通常当作0处理。注意浮点数溢出不看尾数只看阶码有没有超出表示范围这一点和定点数判断溢出的位置完全不同。5. 乘除法与进位逻辑加分题的解法套路这一部分在有些教材里属于选学但只要出现在课后题里就是拉开档次的地方。它不需要你能心算大数乘法需要的是你理解每一步为什么这么移位、这么加。5.1 原码一位乘法与补码一位乘法的区别原码一位乘法比较直观符号位单独处理两数符号异或数值部分按逐位相乘、部分积右移来做。每一步判断乘数当前位是0还是1是1就把被乘数加到部分积上然后整体右移一位。补码一位乘法Booth算法的规则就不一样了它不区分符号位和数值位符号位一起参与运算判断的依据是乘数的相邻两位。当这两位是01末位为1、低位为0时加被乘数是10时减被乘数是00或11时不动然后右移。这里减被乘数是补码运算里难度较高的部分容易漏掉。对比项原码一位乘补码一位乘Booth符号处理单独异或一起参与运算判断依据乘数当前位乘数相邻两位之差加法操作加被乘数01加、10减运算难度简单直观规则复杂但通用举个Booth算法的入门例子x 0.1011y 0.1101求x×y。这里我需要提醒Booth算法的完整过程通常有n1步n是数值位数每一步都要看相邻位、决定加减、再移位手算时建议用表格一行一行记录部分积别在脑子里跳步否则极容易错。5.2 组内并行、组间串行进位加法器的速度账进位逻辑是第2章里偏硬件味的部分。概念并不复杂n位加法器如果每一位都等前一位的进位那速度慢如果采用先行进位超前进位让高位不等待低位直接算出进位速度就快。但是位数一多先行进位的电路太复杂于是出现了分组策略。常见的分法是把加法器分成若干个小组组内用先行进位组内并行组与组之间的进位传递方式有两种——组间串行和组间并行。组间串行就是低组的进位结果传给高组高组才能算出自己的进位延迟随组数线性增加组间并行则是额外设计一个组间先行进位部件让各组的高位进位也能提前算出来延迟更小。这类题通常给一个具体位宽让你算总的进位延迟时间。做法是先把构成一级进位所需时间找出来再数一数串行了多少级。组间串行时进位从最低组传到最高组要一级一级走组间并行时这一串等待被压缩。具体数值因题目给的参数而定核心思路是数串行级数乘单级延迟别被一大堆门电路图吓到。心得这一类题表面上看是硬件设计实际考的是你对串行等待这个概念的直觉。你可以类比成接力赛——组间串行就是必须等前一棒跑完才交接组间并行就是几棒可以同时准备。把物理含义想通了公式就不用硬背。6. 常见问题与排查技巧实录这一章我答疑这么多年发现在同一批题目上会有相当高比例的重复性错误。与其每道题单独讲不如把高频坑点和排查方法整理出来你做题时对着查一遍效率提升非常明显。6.1 高频易错点速查表症状根本原因正确做法补码求相反数出错末位加一漏了或符号位没一起变全部取反、末位加一一步到位溢出判断与进位混淆把最高位进位当成溢出溢出看符号是否异常进位要丢弃浮点编码阶码偏移搞错忘了加127或阶码写成补码阶码用移码等于真值加127对阶方向弄反误以为大阶向小阶看齐小阶向大阶看齐尾数右移规格化后阶码没同步改尾数移位时忘了调阶码左规阶码减一右规阶码加一机器数位数不足忽略题目给定字长先按字长写全再处理数值位6.2 一套可以照着走的解题检查清单每次做完第2章的题我建议你按这个顺序自查一遍花不了几分钟但能拦下绝大多数低级错误位数对不对。题目要求8位我是不是写成了别的位宽最高位是符号位还是数值位符号位对不对。定点数符号位有没有正确参与运算浮点数符号位有没有单独确定编码类型对不对。这道题要的是原码、反码、补码还是移码有没有搞混补充规则结果能不能反验。补码能不能用2的n次方减真值验算浮点数能不能按公式还原有没有溢出。定点数用双符号位或进位法验一遍浮点数看阶码范围。这套清单是我自己写代码做数制转换练习时总结出来的本质上和写程序调试是一个思路——先确认输入格式再确认中间过程最后验证输出。第2章的题很像手算程序用调试思维去做正确率会高很多。6.3 期末冲刺阶段的复习侧重建议如果你是奔着期末去的第2章的时间分配我建议这样进制转换和机器数表示花两成时间练到手熟因为这是送分题丢不起定点数运算和溢出判断花三成时间这是必考主干浮点数表示和运算花三成这是大题富集区乘法和进位逻辑花两成理解原理即可不必死磕极端复杂的算例。这样分配的依据是分值权重和出题概率而不是内容难度。另外说一个很多人忽略的点这一章的简答题考的不是计算是原理。比如为什么用补码为什么浮点数阶码用移码为什么对阶要小阶向大阶看齐这些问题的答案我在前面都点到了。计算题靠练原理题靠理解两条线要分开准备。我在带新生的时候发现真正卡住大家的往往不是不会算而是算完不知道对不对。第2章的答案天生自带验算属性这是它相比后面章节最友好的地方。你要做的就是把验算变成肌肉记忆每道题都回验一次。一开始会觉得慢练上二十道之后你会发现验算几乎不占时间但它帮你省下的返工和丢分远超这点投入。这份习题集的价值也正在于它逼你养成算对和算准的习惯这两种习惯会一直跟着你走到整门课结束甚至走到你以后真正去读硬件手册、看数据手册的那一天。
返回列表