ARTICLE DETAIL

资讯详情

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

计算机组成原理运算器章节:补码运算与溢出判断课后题全解析

计算机组成原理运算器章节:补码运算与溢出判断课后题全解析 计算机组成原理这门课不少院校用的都是微课版教材第三章节“运算方法与运算器”可以说是整门课的分水岭——前面的进制转换、真值表示还属于热身到了这一章补码运算、溢出判断、乘法除法器、ALU设计一股脑全来了。很多同学在这章开始掉队不是因为内容有多高深而是习题答案往往只给一个最终结果中间推导过程一笔带过你对着答案都不知道自己错在哪一步。这篇内容我把第三章课后习题里最高频、最核心的几类题型重新梳理了一遍每题都给出完整推导过程和关键踩坑点覆盖补码加减、溢出判断、移位运算、乘除法实现、ALU功能表分析这几大块。适合正在学运算器章节的本科生也适合期末突击和考研复习第一轮的同学参考。1. 第三章核心框架与复习主线1.1 运算方法章节的知识地图在做题之前先把这一章的知识结构在脑子里搭起来。运算器部分看上去题目类型多但你归纳下来就三条主线第一条主线是“数的机器表示”。原码、反码、补码、移码之间的转换这是整章的底层地基。我见过太多同学补码加减法算错追根溯源不是加法不会而是真值转补码、补码转真值这一步出了岔子。这里有一个必须刻进DNA的规则正数的原码反码补码负数的补码是原码除符号位外取反加1。而补码转回真值时如果你不记得“符号位不变、按位取反再加1”这个逆过程也可以用更不容易错的判断法——看补码符号位是1说明是负数直接对这个补码再取反加1就得到原码的数值部分。第二条主线是“定点数的四则运算”。加减法考察补码运算和溢出判断乘除法考察原码一位乘法、补码一位乘法Booth算法、原码加减交替除法。这部分是习题集的绝对主力也是期末考试大题的高发区。第三条主线是“运算器的硬件实现”。包括加法器的进位链设计串行、并行、组间串行进位、ALU芯片的功能表解读、标志位ZF、OF、SF、CF的产生逻辑。这类题目偏设计需要你把前两条主线的数学逻辑转换成电路思维。做课后题时我强烈建议你先不看答案按照这三条主线给每道题归类。归类的过程就是建立知识树的过程比单纯刷题效率高得多。1.2 课后习题的类型分布与考察重点微课版第三章的课后题整体分布是有规律的。我统计过近几届学生反馈的常见题型大致分成五类第一类是进制转换与真值表示题占比不高但几乎每章必考属于送分题但送分题最容易因为粗心丢分。第二类是补码加减运算与溢出判断这是最核心的基础题。变形常考双符号位判断溢出、单符号位判断溢出、以及结合硬件标志位判断结果是否有效。第三类是移位运算与舍入处理。算术移位和逻辑移位的区别移位与乘除2的幂次之间的关系这些都是高频考点。第四类是定点乘除法运算。原码一位乘法器的手算流程、补码一位乘法的校正法、Booth算法的运算表这类题分值高、过程长是最容易在细节上出错的。第五类是ALU与加法器设计。像74181的功能表分析、组间串行进位的延迟计算这类题目考察你对硬件结构的理解深度。2. 各类题型的通用解法与底层原理2.1 进制转换与真值表示一切运算的地基进制转换虽然基础但在题目里往往不是直接考“把十进制转二进制”这么简单而是藏在数值范围求解、机器字长判断这些题里。比如问某机器字长8位用补码表示定点整数能表示的最小负数是好多看似是填空题实际考的是补码的表示范围。这类题的通用解法是记牢公式补码定点整数n位的表示范围是-2^(n-1)到2^(n-1)-1。8位就是-128到127。很多人不知道为什么最小负数是-128而不是-127根源在于补码的0只有一种表示多出来的编码给了最左边的那个负数。补码-128的二进制表示是1000 0000你用“原码取反加1”是算不出这个数的因为它的原码在8位里不存在。这个特例一定要单独记。转换题的实操技巧我推荐“分组转换法”做二进制和十六进制的互转四位一组从二进制小数点开始分别往两边分。转十进制时用“权值展开法”注意别把符号位当成数值位一起展开。2.2 补码加减运算与溢出判断最容易被扣分的环节补码加减运算有一个让人又爱又恨的性质减法可以统一成加法来做。但天道好轮回统一的过程里符号位参与运算带来一个致命问题——溢出。溢出判断的通用方法有三种但我建议考试时优先用双符号位法也叫变形补码法因为它的判断标准最直观运算结果的两个符号位不一致就是溢出。01表示正溢出10表示负溢出。最高符号位永远是真正的符号位次高符号位参与运算这个逻辑一旦用熟比看进位判断快得多也不容易漏。很多同学会混淆“进位”和“溢出”。这两个概念必须分清楚进位是最高有效位产生的进位输出溢出是运算结果超出了机器字长能表示的范围。打个比方体温计最高刻度是42度你量出来43度这不是“进位”的问题是“溢出”了——超出了能表示的范围。进位的本质是量程内的位扩展溢出是超量程二者完全不是一回事。2.3 原码/补码乘法与除法从手算到机器实现的思维切换乘法除法题是第三章里最劝退的部分。不少同学做原码一位乘法手算算得飞起但一让写递推公式就懵。问题出在把“手算过程”和“机器迭代过程”割裂了。原码一位乘法的核心思想说穿了就是乘法可以拆成一系列加法和右移操作的循环。每次根据乘数的最低位决定加不加被乘数然后部分积右移一位。注意这里是逻辑右移因为原码乘法符号位单独处理数值部分不带符号。每轮右移相当于把权重降一档和十进制乘法的“错位相加”是一个道理只是二进制里移位更简单。补码一位乘法Booth算法看起来复杂核心是引入了一个附加位把乘数从低位往高位扫描根据相邻两位的差值决定是加上被乘数、减去被乘数还是不动。这个算法最大的价值在于能统一处理负数不需要像原码乘法那样把符号位剥离开。我自己做这类题的习惯是先画出表哥每一行记录“上次部分积操作结果右移后的部分积乘数附加位”一步步往下填闭着眼睛就不会漏步骤。除法这块原码恢复余数法和加减交替法不恢复余数法是重点。恢复余数法的逻辑简单但步数多每次余数为负就恢复相当于试商失败要回退。加减交替法则通过“余数左移一位符号为正减除数符号为负加除数”的规则避免了回退效率高。这部分的习题一定不要只算答案要跟住每一步的余数符号变化因为后续的商位就是根据余数符号定的。3. 精选课后习题详解3.1 进制转换与表示范围类题目详解习题1设机器字长为8位X -29求X的原码、反码、补码。解析这类题每次出现都有一堆人做错原因不是不会转换而是字长的限制没注意。第一步把29转成二进制。29 16 8 4 1 2^4 2^3 2^2 2^0所以二进制为 1 1101补齐8位数值部分就是 0001 1101。第二步加上符号位。X -29是负数符号位为1。所以原码 1001 1101。第三步求反码。反码是在原码的基础上符号位不变数值位按位取反。所以反码 1110 0010。第四步求补码。补码 反码 1 1110 0011。验算一下补码1110 0011符号位为1说明是负数数值部分取反加1得到 001 1101 29加上负号得到-29正确。这类题我额外叮嘱一句如果题目说“机器字长8位求-29的补码用十六进制表示”那就再走一步把1110 0011从右往左四位一分得到 E3。很多同学这里会栽在“符号位扩展”上稍后第4章会有专门讲解但建议现在就养成补码十六进制直接写对的习惯。习题2设机器字长为8位用补码表示定点整数求X -128的补码。解析这道题是典型的“陷阱题”陷阱不在计算而在概念。8位补码的范围是-128到127-128是刚好卡在边界上的值。8位二进制补码中正数范围是0000 0000到0111 1111即0到127负数范围从1000 0000开始。注意这里没有正0和负0之分补码的0只有一个编码0000 0000所以多出来的编码1000 0000就给了-128。计算过程128的二进制是1000 0000但注意这是无符号视角。对于补码-128直接记作1000 0000。你如果用“原码取反加1”的思路会发现根本找不到-128的8位原码这就是前面说的特例。这类题的更一般形式是问“n位补码能表示的最小负数是多少”答案直接写-2^(n-1)就行。3.2 补码加减运算与溢出判断详解习题3设机器字长为8位X 100Y 50用补码求X Y并判断是否溢出。解析第一步转补码。X 0110 0100Y 0011 0010。第二步直接相加0110 0100 0011 0010 ----------- 1001 0110结果的符号位是1说明按补码解释这是一个负数。两个正数相加得到负数这显然不合理——没错这就是正溢出。100加50应该等于150但8位补码能表示的最大正数是127150超出了范围所以溢出。用双符号位验证X变形补码为00 110 0100两个符号位都是0Y变形补码为00 011 0010相加得到10 001 0110两个符号位分别为1和0不一致判定溢出。最高符号位1是真正的符号但次高符号位0说明进位没有传递到最高位——数据已经被截断了。这种“01”组合表示正溢出。实际工程里怎么处理溢出发生后结果不可用计算机会触发溢出异常或把结果丢弃而不是“强行塞进8位里”。很多初学者会困惑那150用8位补码装不下机器是不是就存了个错的对如果硬件不检测溢出它就会按截断后的二进制解析出错误结果正因为这样溢出检测电路OF标志位才如此重要。习题4设机器字长为8位X -64Y 32用补码求X - Y并判断是否溢出。解析这里的关键是X - Y X (-Y)。先把Y变成-Y。Y 32补码为0010 0000。-Y就是-32补码通过取反加1得到1101 1111 1 1110 0000。X的补码-64 1100 0000。相加1100 0000 1110 0000 ----------- 1010 0000最高位有进位1但结果的符号位是1按负数解释是-96。-64 (-32) -96数学上正确。但这里有个更细致的点单符号位判断法看的是“符号位进位”和“最高数值位进位”是否一致。最高数值位次高位产生了进位符号位也产生了进位两者相同所以无溢出。用双符号位验证X 110 0000补充成 11 100 0000Y补码1110 0000补充成 11 110 0000相加得 11 0110 0000去掉最高的进位1得到 11 0110 0000两个符号位都是1一致无溢出。结果正确。做这题容易出错的点是不知道X - Y要先把Y变号很多同学拿-64直接减32的补码然后发现算出来的东西对不上号就是因为漏掉了“减法转加法”时减数需要取补码这一步。3.3 移位运算与舍入处理详解习题5设机器字长为8位X 0011 0110无符号数54分别逻辑左移一位、逻辑右移一位、算术右移一位写出结果并说明数值变化。解析移位是个性价比极高的考点规则不难但需要分清类型。逻辑左移一位所有位左移最低位补0。0011 0110左移一位变成0110 1100 108。54×2 108正确。逻辑右移一位所有位右移最高位补0。0011 0110右移一位变成0001 1011 27。54÷2 27正确。算术右移一位算术移位针对有符号数右移时最高位保持原符号位不变。这里X如果是补码表示的有符号数符号位是0正数算术右移一位同样是0001 1011 27因为正数的算术右移和逻辑右移效果一致。为了区分我通常补考一道负数移位题设X 1101 0010这是-46的补码算术右移一位结果是多少最高位符号位1不动其余位依次右移最右边一位丢弃1110 1001 -23。-46÷2 -23符合预期。但逻辑右移则是0110 1001 105数值含义完全不同。移位运算在应用题里还有一个变形用移位实现乘除2的幂。比如某题问“用移位和加法实现X×10”参考答案是 X×10 X×8 X×2 (X左移3位) (X左移1位)。这种题在后面的指令系统章节还会反复出现本质是放手算乘法、用机器擅长的移位和加法组合来算。3.4 ALU功能表分析与加法器设计类题目详解习题6某8位ALU芯片的操作控制端为S0、S1、S2、S3功能表部分内容如下。已知输入A 1100 1100B 1010 1010求当S3S2S1S0 1001F A B、S3S2S1S0 0110F A - B时输出F的值和标志位。S3S2S1S0功能说明1001F A B0110F A - B解析ALU的题目说到底是“先算逻辑再看标志位”。先看加法A B 1100 1100 1010 1010 1 0111 01108位结果为0111 0110最高位进位CF 1。注意这里的几个标志位ZF零标志看结果是否为0结果0111 0110非0所以ZF 0SF符号标志看结果最高位最高位为0所以SF 0OF溢出标志看是否溢出。这里我们判断溢出要看的是“带符号数视角”A的补码作为有符号数是-521100 1100的数值部分取反加1为0011 0100 52B是-86相加应该是-138超出8位补码范围-128明显溢出所以OF 1。但CF1不一定是溢出这一点和前面强调的一致。再看减法F A - B A (-B)。-B就是把B按位取反加11010 1010取反是0101 0101加1得到0101 0110。A加上这个值1100 1100 0101 0110 1 0010 00108位结果为0010 0010 34。从有符号数角度验证-52 - (-86) 34结果正确且未溢出OF 0。最高位进位CF 1这是减法中“借位取反”的体现很多同学不理解为什么减法里CF1反而代表没有借位其实是因为补码减法统一成加法后CF的含义变成了“无符号数加法是否产生进位”需要单独记忆。习题7某加法器采用组间串行进位方式由4个4位CLA加法器级联构成16位加法器。每个CLA加法器内部先行进位生成时间为T1组间进位传递时间为T2和输出时间为T3。求总加法时间表达式。解析这道题是热搜里“组间串行进位”词的常见出题形式也是很多教材的课后原题。组间串行进位的含义是每个4位CLA组内部是快速的先行进位但组与组之间的进位是按串行方式传递的即第1组的进位输出作为第2组的进位输入依此类推。总时间 第一组生成组进位的时间 后面3组每组传递进位的时间 最后求和的时间。第一组要等输入进位和A、B到达后先经过内部逻辑生成组进位时间记为T1中间3组每组在获得输入进位后需要传递组进位每组需要T2最后一组的进位到达后组内产生和输出需要T3。总时间 T1 3×T2 T3。如果扩展到n个组总时间 T1 (n-1)×T2 T3。这类题解题的唯一难点是搞清楚“第一组”和“最后一组”的特殊性中间的组只做进位传递。很多人错在把T1乘了4次这就是没理解串行进位的本质——只有第一组需要从零开始生成进位后续组全部是等上游进位来了才能动。4. 常见错误与排查技巧实录4.1 符号扩展的坑从8位到16位为什么会变号课后题里经常出现“把8位补码扩展到16位”的题。比如将补码1000 1011扩展到16位。正确做法是把符号位1复制到高8位得到1111 1111 1000 1011。不少同学直接把高8位补0得到0000 0000 1000 1011这就铸成大错——符号位变了值从负数变成了正数。这里我教一个百试不爽的判断方法扩展前后的真值必须一致。1000 1011作为8位补码是真值-117扩展到16位后的补码也应该表示-117。你扩展完可以验证一下值变了就是扩展错了。符号扩展不只在习题里出现在汇编程序里从byte转word、在C语言里char转int全是这个逻辑这也是很多同学写程序出现隐式转换bug的根源。4.2 溢出判断三种方法为什么有时候结果不一致我在批改作业时发现有些同学单独用三种方法判断同一道题结果“不一致”于是非常困惑。其实冲突的根源在于适用范围。单符号位法观察进位和双符号位法适用于补码加减运算而“正正得负、负负得正”的口诀只适用于两个同号数相加的场景如果是异号数相加永远不会溢出但很多同学硬套口诀就会误判。还有一种情况有些同学会用“结果的符号和加数符号不同就是溢出”来判断这在同号相加时成立但异号相减时也会出现“结果符号和减数相同”的情况需要先化成加法再判断。实操建议考试时固定用双符号位法因为它是从运算过程直接判断的不容易受场景影响。所有加减法题目先把两个数写成双符号位正数为00开头负数为11开头相加后看结果的两个符号位。这个方法步骤多但正确率最高不需要绕弯子。4.3 原码乘法中部分积的右移到底是算术右移还是逻辑右移原码一位乘法中部分积始终是正数因为符号位单独处理数值部分都是绝对值所以右移时最高位补0这是逻辑右移。但补码一位乘法Booth算法中部分积是带符号的因此右移必须用算术右移即最高位保持符号不变。两者的区别经常出现在填空题和应用题里一个细节就是一分之差。判断技巧很简单看到“原码乘法”四个字默认所有数值运算的都是绝对值右移补0看到“补码乘法”或者“Booth”默认符号位参与运算右移做算术移位。4.4 除法中恢复余数法的“恢复”到底恢复的是谁做题时还有个高频困惑恢复余数法里余数为负时为什么要把余数恢复成上一步的正余数我举个直观例子9÷4第一步9减4得5余数5为正商上1下一步5减4得1余数为正再上11减4得-3余数为负说明这一步减多了要“恢复”回1商上0。恢复的是“被错误减掉的余数”即把减多了的那一步回退掉。这种试商逻辑在十进制除法里也有——你试商试大了就要把商调小把多减的部分加回来。理解了这一点你就明白为什么加减交替法效率更高——它不会退回去而是根据余数符号直接决定下一步是“加除数”还是“减除数”省掉了恢复操作但每一步的余数可能是负数需要额外记录。考试时如果时间紧张优先用恢复余数法因为它每一步都有明确的“恢复”锚点不容易算飞。5. 配套学习策略从做题到真正理解运算器5.1 用仿真实验验证理论运算做第三章课后题我强烈建议配合逻辑仿真工具LabVIEW或Logisim做一个4位加法器把书上的“进位链”真正搭出来一次。为什么建议搭硬件因为课后题做的是“输入输出”层面的验证一旦到了硬件层面你会被迫理解进位怎么生成、怎么传递、哪些信号是并行产生的。比如组间串行进位和组内先行进位看教材文字很容易糊涂但在Logisim里点开芯片内部或观察引脚延迟一眼就明白。具体实验建议先搭一个4位串行进位加法器逐位观察进位传播再搭一个4位先行进位加法器观察组进位生成逻辑最后用两个4位加法器搭一个8位组间串行进位加法器对比三者的延迟差异。做完这三个实验教科书上那些时序计算题就不再是背公式而是变成你亲眼见过的事实。5.2 期末与考研复习的侧重点差异同样的课后题期末复习和考研复习的用法完全不同。期末考试侧重“会算”所以重点放在补码运算、溢出判断、原码一位乘法的手算画表题这些题套路固定练熟就行。考研则侧重“会推”考生需要能推导Booth算法的递推公式、能从延迟角度分析加法器结构优劣、能结合后面的CPU设计章节综合出题。如果你在准备考研建议除了做题还要学会给每个算法画“状态转移图”和“数据通路图”。考研大题经常给一个数据通路问“乘数寄存器的位数是多少”“部分积寄存器初值是多少”“需要经历多少次加法和移位”这些跨章节题目本质上就是第三章的乘法算法加上第五章的数据通路分析。5.3 资源推荐与刷题顺序除了微课版教材的课后题我建议按下面的顺序补充练习先做王道考研的计算机组成原理章节练习再做历年408真题中的相关题目最后回到课后题二刷错题。王道练习的特点是把考点按大纲压实和教材章节的对应度很高408真题的质量是最高的运算器题目往往和前后的指令设计结合起来考能训练你的综合能力。二刷课后题时着重看那些第一遍做错的题用一句话写下当时的错误原因比如“忘了双符号位法”“减法忘记取补码”考前只看这一句话清单效率极高。关于参考答案目前网上流传的答案版本比较多有些答案本身就有印刷错误。碰到看不明白的推导优先对照教材例题的格式反推比追着一个不明来源的答案硬看更有用。如果实在拿不准哪一步可以按“先算数值、再验符号、最后看标志位”的顺序自己复核。这一章是整个计算机组成原理里最“硬”的地方后面讲到CPU、指令系统、存储系统很多东西都得回来找运算器的基础。课后题做错不可怕可怕的是做错了不看过程只想抄个正确答案。每次一看到“补码”“溢出”这些词就条件反射地想起那双符号位的判断规则你这一章就算真正学踏实了。我自己当年也是在第三章翻了车后来痛定思痛把每一类题的推导过程都白纸黑字写了一遍才在后来的系统结构课程里游刃有余。希望这份解析能帮你少走这段弯路。
返回列表