news 2026/11/6 0:20:50

复试Day8:从补码到CLA加法器,计算机组成原理高频考点梳理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
复试Day8:从补码到CLA加法器,计算机组成原理高频考点梳理

最近在准备计算机考研复试,今天已经是连轴转的第八天。早上七点半把闹钟按掉的时候,脑子里还在回放昨晚背的Cache替换算法,这种状态想必每个考研人都懂。Day8我没有继续刷操作系统,而是把大头留给了计算机组成原理,原因很简单:翻了几所学校的复试真题之后,发现这门课几乎是无差别覆盖的高频考点,面试官也特别喜欢拿它当连环追问的素材。这篇笔记适合所有正在准备计算机考研复试、保研机试或者期末突击的同学参考,尤其是对“数字逻辑+组成原理”切换不过来、看到加法器就犯迷糊的人,应该能少走不少弯路。

1. 复试Day8,我把主攻方向压在了“计算机组成原理”

1.1 复试为什么绕不开计算机组成原理

很多学校复试笔试的专业课是三选一甚至五选一,看起来可以挑软柿子捏,但面试环节没法挑。计算机组成原理这门课的特殊之处在于,它是连接硬件和软件的那座桥,几乎所有面试官都默认你应该懂。操作系统里的进程切换,底层靠的是中断和时钟;编译原理里的指令生成,最终落在指令系统的设计上;哪怕是做AI方向,聊到算力、GPU、异构计算,也能扯到存储层次和流水线。所以你越是说自己方向偏应用,面试官越可能拿组成原理来试探你的底线。

另一个现实原因是,复试准备时间普遍只有一两个月,别说把五门课都吃透,能稳住两三门就算不错。组成原理的考点相对固定,数据表示、运算器、存储器、指令系统、CPU、总线与I/O,翻来覆去就这些。相比操作系统的主观题和大题,组成原理的题目更“讲道理”,推得出就是推得出,不太容易出现背了书还是不会写的情况。Day8我给自己定的目标就是:把数据表示与运算器这一块彻底拿下,顺带在Quartus里把加法器真正搭出来。

1.2 今天的学习路线与时间安排

我的复习习惯是上午啃硬骨头,下午做题验证,晚上整理错题和笔记。Day8的时间表大概是这样:

  • 8:30-10:30 原码、反码、补码、移码,以及补码加减法与溢出判断,配合王道和唐朔飞的教材对照看
  • 10:30-12:00 全加器逻辑表达式、串行进位、组间串行进位、并行进位,把所有进位公式亲手推一遍
  • 14:00-17:00 Quartus原理图实验,搭4位加法器并做功能仿真
  • 19:00-21:30 计算机系统结构与操作系统的高频计算题,主要是Amdahl定律、流水线参数、页面置换缺页次数
  • 21:30-22:30 简历与调剂信息整理

这份时间表有两点我要特别说:第一,下午一定要动手做实验,复试材料里如果有课程设计或者硬件实验经历,面试的时候就有东西可聊;第二,晚上留出固定时间处理调剂与信息搜集,别等到一志愿出结果再手忙脚乱,调剂拼的就是信息差。

2. 数据表示与运算:面试官问得最细的一块

2.1 原码、反码、补码,用三个例子彻底讲明白

数据表示这块,很多同学是背结论的:“正数的原反补相同,负数的反码是符号位不变其余取反,补码是反码加一。”背结论能应付选择题,但复试面试时面试官会让你现场算,还会追问“为什么补码能多表示一个数”。我Day8重新推导了一遍,发现用机器字长8位举例子最直观。

先看正数,比如+19,符号位0,数值部分0010011,所以:

  • 原码:00010011
  • 反码:00010011
  • 补码:00010011

再看负数,-19。原码的符号位变1,得到10010011。反码是符号位不动,数值位取反,得到11101100。补码在反码基础上末位加1,得到11101101。

这里最容易出错的是负数的补码转回真值。很多同学习惯“先减一再取反”,其实更快的办法是:从右往左找到第一个1,这个1左边所有位取反,符号位不动。比如11101101,最右边的1在第0位,那它左边取反得10010011,读出来就是-19。这个技巧笔试和面试都适用,手算速度能快一倍。

至于“为什么补码能多表示一个数”,关键在-128。8位原码和反码能表示的范围是-127到+127,因为10000000和00000000都表示0,出现了正负0的浪费。补码把10000000定义为-128,所以范围变成-128到+127。具体推导是:

补码的模是2^8=256。比如求-128,因为-128 = 128 - 256,而128的二进制是10000000,所以-128的补码就是10000000。

这个推导在面试时说出来,比单纯报结论有说服力得多。

2.2 补码加减法最容易被追问的溢出判断

补码的加减法规则简单:按二进制相加,符号位自然参与运算,舍去最高位进位即可。比如计算-19加上28:

  • -19的补码:11101101
  • 28的补码:00011100
  • 相加:11101101 + 00011100 = 1 00001001
  • 舍去进位:00001001,也就是+9

这个例子能看出补码把减法变成了加法,硬件上只需要一个加法器就能同时处理加减,这就是补码设计的核心动机。

但面试官绝不会止步于此,必问的下一句是:“怎么判断溢出了?”我整理了三种方法,自己最推荐的是“双符号位法”。

先说单符号位法。两个同号数相加,如果结果符号变了,那一定溢出。比如8位补码里120加120:01111000加01111000等于11110000,结果是-16,两个正数相加反而得到负数,显然溢出。但单符号位法对“异号相加不会溢出”的表述不够严谨,而且面试官往往会追问一句“符号位进位和最高位进位不同会发生什么”。

更严谨的是进位异或法。设符号位进位为C_out,最高数值位进位为C_n-1,如果C_out和C_n-1不同,则溢出。还是刚才的例子:

  • 01111000加01111000,最高数值位(第6位)相加产生进位1,符号位相加也产生进位1,两者相同,看起来没溢出。但这不对啊?

这里我踩过坑。实际上8位补码的“位下标”要看你怎么数。用从低位到高位的下标更清晰:设第7位是符号位,第6位是最高数值位。120加120时,第7位到第0位分别是01111000。第6位1加1得0进位1;第7位0加0加进位1等于1,符号位进位为0。所以C_n-1=1,C_out=0,两者相异,溢出。这就对了。面试时干脆用双符号位法最不容易翻车。

双符号位法也叫变形补码,计算时在符号位前额外加一位。8位补码演变成10位存储,比如:

  • +120变形补码:001111000(两个符号位00)
  • 两个相加:001111000 + 001111000 = 011110000

结果两个符号位是01,说明正溢出。如果是10,说明负溢出。两个符号位相同(00或11)则无溢出。这个方法笔试时多写一位就行,面试解释起来也顺,因为面试官能立刻看出你学过教材中的“模4补码”。

3. 组间串行进位与先行进位加法器:从公式到电路

3.1 全加器与进位链

面试问运算器,很少直接问“你画一个全加器”,但一定会问“加法器为什么慢”“串行和并行进位区别在哪”。要回答清楚,得先回到全加器。

全加器有三个输入:本位两个加数A_i、B_i,以及来自低位的进位C_i-1;两个输出:本位和S_i以及向高位的进位C_i。逻辑表达式是:

S_i = A_i ⊕ B_i ⊕ C_i-1

C_i = A_i·B_i + (A_i ⊕ B_i)·C_i-1

这里可以做一个巧妙变换。定义两个信号:

生成函数 G_i = A_i·B_i

传递函数 P_i = A_i ⊕ B_i

于是进位表达式简化为:

C_i = G_i + P_i·C_i-1

G_i的意义是“我这一位无论如何都会产生进位”,P_i的意义是“我这一位可以把低位的进位传递上去”。这两个信号是整个进位链分析的起点,面试时先写出这个再谈并行进位,思路会很顺。

如果只是把一个个全加器级联起来,也就是C_i接到下一个全加器的C_i-1,就得到行波进位加法器,英文叫Ripple Carry Adder。它的致命问题在于进位像波浪一样从低位逐步传到高位,16位加法器最坏情况下要经过16个全加器的进位延迟。我当年第一次听到“行波进位慢”,只觉得是一句考点话,直到在Quartus里把8位行波加法器的仿真波形展开,看到最高位的和迟迟不跳变,才真正理解了“进位链是性能瓶颈”这句话。

3.2 4位先行进位逻辑推导

行波进位慢,是因为每一位的C_i必须等C_i-1算完。要提速,思路是让进位“提前算好”,这就是先行进位加法器(Carry Lookahead Adder,CLA)。

把C_i = G_i + P_i·C_i-1逐层展开。设最初始进位为C0,对4位展开:

C1 = G1 + P1·C0

C2 = G2 + P2·G1 + P2·P1·C0

C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·C0

C4 = G4 + P4·G3 + P4·P3·G2 + P4·P3·P2·G1 + P4·P3·P2·P1·C0

仔细观察,C4的表达式里每一项的G和P都来自输入A、B,不依赖任何中间进位。意思是只要A和B稳定下来,C1到C4都能通过组合逻辑直接算出来,不用一级一级等。这就是“并行”的含义。

我不建议死背这四个式子,背了也会忘。我自己的推导思路是:C_i等于“从i到1所有可能产生进位并一路传到我这的位置,加上从C0一路传过来的情况”。说得口语点,任何一个低位的G_i都能“生”一个进位,并且如果后面所有位的P都是1,这个进位就能“穿透”到当前位;如果C0是1且所有P都是1,它也能穿透过来。这样理解,就算考试让你写8位甚至16位展开式,也能现推。

3.3 组间串行、组内并行的16位加法器结构

单个4位CLA能做4位并行进位,那16位怎么办?两个方案。

第一个方案叫单级先行进位,结构是“组内并行、组间串行”。把16位拆成四组,每4位做一个小CLA,组内并行产生C4、C8、C12、C16,但第一组的C4要作为第二组的初始进位C0,第二组的C8再作为第三组的C0,以此类推。这就是热词里提到的“组间串行进位”。它比纯行波快,因为组内不用逐位等进位,组间还是串行的,所以叫做单级先行进位。

第二个方案叫多级先行进位,在组间也引入一组CLA逻辑,专门用来同时算出C4、C8、C12、C16。教材里对应的是74182先行进位发生器芯片。这时候16位加法器的延迟不再是四段串行,而是所有组可以同步进行组内运算,速度更快,代价是逻辑规模和芯片引脚复杂度上升。

复试问答到这里基本就是标准套路链:行波进位为什么慢 -> CLA怎么改进 -> 16位怎么做 -> 组间串行和组间并行的取舍。能把这个链路完整讲清楚,比背十个名词解释都管用。

4. Quartus原理图实验:今天把加法器真的搭了出来

4.1 实验环境与建工程步骤

光推公式不够踏实,Day8下午我在Quartus里把4位串行进位加法器和4位CLA都搭了一遍。很多人复试材料里的“课程设计”写的是单片机或者Web项目,硬件描述类实验很少有人主动提,可一旦提了,面试官眼睛会亮。

我用的环境是Quartus II 13.0sp1,因为很多学校的计算机组成原理实验课件还是基于这个版本。新版Quartus Prime Lite也能用,但界面变化大,新手按旧教程操作容易找不到入口。建工程的标准流程:

  1. File -> New Project Wizard,工程名不要用中文,路径也不要有中文和空格
  2. 器件型号直接选Cyclone IV E系列下的EP4CE6F17C8,这是很多开发板用的片子
  3. EDA Tool Settings页面可以跳过,后面仿真直接再用Quartus自带的Simulator
  4. 新建Block Diagram/Schematic File,后缀是.bdf

这里有个隐藏坑:工程的顶层实体名必须和顶层文件名一致,否则编译报“Top-level entity not found”。我第一次建工程顺手把文件命名成sche1.bdf,工程名却是adder16,编译直接红一片,后来统一改成adder16才过。

4.2 用原理图搭4位加法器的关键步骤

在原理图里搭加法器,核心就是调元件、连线、命名引脚。Quartus原理图文件空白处双击,会弹出Symbol窗口,从primitives下拉菜单里找:

  • logic目录下:and2、or2、xor、not
  • pin目录下:input、output

全加器需要两个异或门、两个与门、一个或门。表达式S_i = A xor B xor Cin需要两个异或串联;C_i = (A and B) or ((A xor B) and Cin),需要先算A xor B,再和Cin相与,最后和A and B相或。我自己用元件搭全加器时,顺序是:

  1. 放置两个xor,第一个xor的输入是A和B,输出接第二个xor的一端,另一端接Cin
  2. 放置一个and2,输入A和B,输出接or2的一端
  3. 放置另一个and2,输入第一个xor的输出和Cin,输出接or2的另一端
  4. 为了命名清晰,给每个输出都加output引脚

搭一个全加器后,整体复制三份,把每一级的Cout垂直连到下一级的Cin,就是4位行波进位加法器。这个连线过程看起来简单,但很容易把P和G的线接错。我的习惯是每连一根线就给网络命名,比如c0、c1,编译时如果出现wire dangling的警告,就能凭名字快速定位。

4.3 仿真验证与踩坑记录

搭建完成只是第一步,复试里讲实验一定要能说“我验证过了”。Quartus里做功能仿真的步骤是:

  1. 编译通过后,File -> New -> University Program VWF,新建矢量波形文件
  2. 在波形编辑区右键Insert Node or Bus,找到编译出来的输入输出端口,把A[3..0]、B[3..0]、Cin、S[3..0]、Cout全部加进去
  3. 给输入设激励。简单办法是把A和B设成计数信号,Cin设成时钟;
  4. 运行功能仿真前,必须先在Simulator Tool里选Functional,然后点Generate Functional Simulation Netlist生成功能网表
  5. 点Run Functional Simulation查看波形

我今天踩了三个坑,写出来给你们避雷。第一个,仿真波形全是X或者全是U,原因通常是输入端有引脚没连接,悬空输入在功能仿真里会变成未知态。第二个,仿真结果输出的是一个毛刺一样的窄脉冲,检查后发现是选成了时序仿真但没做时序约束,功能仿真才是验证逻辑正确性的最快路径。第三个,文件命名问题,波形文件保存时如果和工程名不一致,Quartus会提示找不到仿真对象,直接报错,保存成工程名同名文件最省事。

对方波形的验证方式也分享一下:加法器功能仿真最直观的激励是让B固定为0001,A从0000计数到1111,这样S正好是A加1逐次递增,Cout只在1111加1时拉高一次。波形上能看到S的节奏和Cout的变化,一眼就能确认电路逻辑没接反。这种“设计可验证的激励”的思路,面试时讲到会显得实操经验很足。

5. 系统结构、操作系统与复试的“高频暗箭”

5.1 计算机系统结构:流水线三个计算必须会

Day8晚上我把系统结构里最常考的流水线计算重新过了一遍。复试题目很少直接让你默写五段流水线,但特别喜欢在面试里给一组参数让你心算加速比。

流水线的核心公式是:k段流水线执行n条指令的总时间T_k = (k+n-1)×时钟周期。吞吐率TP = n/T_k,最大吞吐率趋近于1/时钟周期。加速比S = n×k/(k+n-1),当n远大于k时,S趋近于k。

举个例子,4段流水线执行100条指令:

T = (4+100-1) = 103个时钟周期

加速比 = 100×4 / 103 ≈ 3.88

面试官可能会追问“为什么不是刚好4倍”。答案是有建立时间,流水线开始前k-1个周期是空泡,最后k-1个周期在排空,总共多出(k-1)×2个周期的边际开销,但因为n远大于k,这部分占比很小。这个“为什么要算平均CPI而不是直接报理想值”的逻辑,是面试加分点。

Amdahl定律也是高频计算题。公式是:

加速比 = 1 / ((1 - 可改进比例) + 可改进比例 / 改进倍数)

举个例子,某个运算占总执行时间60%,把它加速到原来的4倍:

整体加速比 = 1 / (0.4 + 0.6/4) = 1 / 0.55 ≈ 1.82

我早年间看到公式很晕,后来总结成一句人话:加速后的执行时间等于“没法改进的那部分时间”加上“被改进部分缩水后的时间”。这句话面试时说出口,面试官往往就点头了,因为这是真理解,不是背公式。

5.2 操作系统:从概念背诵升级到场景分析

Day8我没系统过操作系统全书,但把最容易在面试中出事的几个点拎出来做了卡片化整理。第一是死锁的四个必要条件以及如何破坏每个条件,这个几乎必问,而且面试官会现场给一个场景问“这是哪种死锁”。第二是银行家算法的安全性检查流程,虽然笔试考的概率下降,但作为操作系统里少见的“算法类”考点,面试时能现场推一遍会加分。第三是虚拟内存与页面置换,最常考的是给一个访问序列,算FIFO和LRU的缺页次数。

比如访问序列3、1、2、1、3、4、2、4,物理块3帧。FIFO在第二次访问4时会淘汰3,缺页次数明显比LRU多。板书的计算过程要慢,别跳步,面试官就是看你的做题习惯是否规范。

操作系统这块还有一个隐蔽考点是“进程调度算法”的选择题式问答,比如“什么场景适合短作业优先,什么场景适合时间片轮转”。我的答法是先列指标:周转时间、响应时间、吞吐量,然后说短作业优先对周转友好但饿死风险大,时间片轮转响应友好但上下文切换开销高。这样从指标出发的答案不容易被追问死。

5.3 计算机发展史冷知识:莱布尼茨轮式计算机

热词里有一个“莱布尼茨轮式计算机”,我正好在晚上复习计算机发展史时扫到。别小看这类冷知识,面试官问“说说你了解的早期计算机”时,能接住的人不多。

莱布尼茨轮式计算机是莱布尼茨在1673年前后设计的机械计算器,核心机构是“步进轮”,用一组长度不同的齿柱参与计数,从而实现了机械乘法,这是对帕斯卡加法器“只能加减”的重大改进。面试时提到这个知识,可以顺势引出你对“机械计算-电子管-晶体管-集成电路”这条演进线的认识,也能自然聊到图灵机和冯·诺依曼结构。这类问题虽然不难,但答得出彩的关键是“有名字、有年份、有细节”,而大部分人只停留在“听说过”。

6. 考研复试与调剂的实操建议

6.1 复试笔试、口语和机试怎么安排

今天是第8天,离很多学校出复试通知大约还剩两三周,时间分配必须从“广撒网复习”切到“面向真题冲刺”。我个人的节奏是:笔试科目按历年真题的出题频率排序,高频考点优先;英语口语不用花太多时间背几十个话题,准备自我介绍、毕业设计介绍、为什么选这个学校、未来研究方向这四段就够,每段控制在90秒以内。

机试如果还在犹豫要不要准备,我建议至少刷60道基础题,重点放在“输入输出处理、数组、字符串、排序、简单数据结构”。很多学校机试难度不高,但有一个共同特点:不能用IDE调试或只能本地调试,现场环境陌生,平时不练很容易卡在“怎么读一行的整数”这种低级问题上。机试成绩是硬通货,复试分数拉不开差距时,机试能救命。

6.2 调剂信息搜集和邮件沟通

说到调剂,很多同学心里抗拒,但我Day8晚上做信息整理时的体会是,调剂不是备胎,而是信息战。关键是建立自己的信息表,按“学校、学院、专业方向、去年调剂名额、去年调剂复试线、是否有预调剂系统、导师研究方向、联系方式来源”逐项填写。

邮件沟通方面,我的建议是标题写“考研调剂申请-本科XX大学-初试总分XXX-报考专业-姓名”,正文控制在200字以内,突出三个信息点:初试成绩各科分数、本科期间与目标方向相关的课程或项目经历、为什么想调剂到这个学校。不要群发同一封邮件,那会被一眼看穿。发送时间选在工作日上午9点到10点,邮件被认真阅读的概率最高。

这个阶段容易焦虑,但焦虑帮不了任何忙。我的习惯是每天固定时段查一次消息,其他时间把手机放在够不着的地方,用番茄钟把复习切块。调剂信息不会因为你多刷五分钟手机就多出来,复试分数却会因为这一周的时间利用而拉开差距。

Day8从早上的补码推导,到下午Quartus里亲手搭出加法器,再到晚上整理调剂表格,最大的感受是:复试到最后拼的不是谁记得多,而是谁能在有限时间内把高频考点转化为真正的理解。组间串行进位和CLA的逻辑今天推了一遍,下周还要用Verilog再写一遍,软件描述和原理图描述结合起来,才算真的吃透。如果你这两天也在准备复试,建议也试一下“先手推公式,再动手搭电路”的组合,亲测比单纯刷题印象深刻得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 7:27:18

不依赖框架,用Node.js标准库手写极简API服务

最近整理个人项目时,我看着package.json里一长串依赖列表发了一会儿呆。一个内部工具的API服务,总共六个接口,装了一整套Web框架全家桶,依赖树拉出来两百多个包,每次升级都像拆弹。于是我决定走一次极端:把…

作者头像 李华
网站建设 2026/10/28 12:45:05

计算机毕业设计全流程指南:从选题到答辩的避坑手册

又到了一年计算机毕业设计的高峰期,我后台收到的问题里,一半以上都指向同一个焦虑:“题目还没定怎么办”“老师说我的开题太宽泛”“功能做完了论文不知道怎么写”“答辩被问死在台上”。这些问题的根源其实是一件事:很多人把计算…

作者头像 李华
网站建设 2026/11/2 17:58:08

Java内存模型JMM深度解析:可见性、volatile与happens-before

1. 一个“看起来没问题”的程序,为什么运行结果会让人崩溃?1.1 这段代码真的会死循环吗先看一段很经典的代码,我每次讲 JMM 都会拿它开场:public class VisibilityTest {private static boolean flag true;public static void ma…

作者头像 李华
网站建设 2026/10/28 7:09:58

直升机旋翼空气动力学:从滑流理论到涡流理论的工程解析

简介:直升机飞行原理是航空爱好者和相关专业学生理解旋翼动力学的基础内容。这份PDF文档系统讲解旋翼的空气动力特点、直升机垂直升降与悬停特性、旋翼运动及桨叶铰接结构,并重点阐述旋翼拉力产生的滑流理论与涡流理论,同时给出悬停状态下约9…

作者头像 李华
网站建设 2026/10/28 2:37:44

硬件SPI和软件模拟SPI在配置方面的一点区别

一 硬件SPI和软件SPI顾名思义这种方式是硬件层面的,需要开启并使用单片机里面的SPI外设,IO口要复用到外设,由外设来控制电平翻转;软件模拟就可以随便选择IO口进行配置,需要手动控制电平翻转硬件接线:我使用…

作者头像 李华
网站建设 2026/10/29 16:27:17

如何构建浏览器扩展专用CLI:从impeccable误读到zcode实战

1. 项目概述:一个被误读的 CLI 工具名,以及它背后真实的工程实践逻辑“impeccable”这个词在英语里意思是“无懈可击的、无可挑剔的”,常用来形容工艺、服务或表现达到极致水准。但当它突然出现在技术热搜榜上,和npx、CLI、browse…

作者头像 李华