考研笔记-计算机之计算机组成原理:算术逻辑单元(运算方法)
- 2026-11-07 02:50:12
——如阅读体验不佳,可转为横屏阅读;如微信无法横屏,可尝试文末方法。
表-计算机的运算方法 | ||||
表示 | 运算 | 实现 | 规则 | 溢出判断 |
定点(整数和纯小数)运算 | 移位运算 | 逻辑移位(无符号数) | 1) 移丢; 2) 空位添0。 | 高位移丢1,结果出错;低位移丢1,影响精度。 |
算术移位(有符号数) | 1) 符号位不变(即符号位不参与运算); 2) 移丢; 3) 空位添补(见“表-算术移位空位添补规则”)。 4) 对于双(或3)符号位的补码,最高位符号位为真正符号位,不参与移位,除最高位符号位外的其他低位符号位参与移位,其他同补码。 | 1) 原码:(数值位)高位移丢1,结果出错;低位移丢1,影响精度; 2) 补码:(数值位)高位移丢0,结果出错;低位移丢1,影响精度; 3) 反码:(数值位)高位移丢0,结果出错;低位移丢0,影响精度; | ||
加减运算 | 减法运算可以看做被减数加上减数的负值,即 | |||
原码 | 和的符号位与数值位分开运算,结果为原码。 | |||
补码 | 1) 和的符号位与数值位一起运算,结果为补码; 2) 和的符号位产生的进位丢掉(即取模); 3) 补码加法基本公式: a) 整数: b) 小数: | 异或结果为1则溢出(正溢出或负溢出): 1) 1位符号位:两操作数符号相同,且结果符号位与操作数符号位的异或结果为1则溢出,结果符号位为0表示正溢出,结果符号位为1表示负溢出; 2) 1位符号位:结果的符号位产生的进位与最高数值位产生的进位的异或结果为1则溢出,结果符号位为0表示正溢出,结果符号位为1表示负溢出; 3) 2位符号位:结果的两位符号位的异或结果为1则溢出,高位符号位为0表示正溢出,高位符号位为1表示负溢出(即高位符号位代表实际结果真正的符号); | ||
乘法运算 | 1) m位数与n位数相乘,结果至少m+n-1位,至多m+n位(故部分积多取1位); 2) 乘法运算可用加法和移位来实现(乘数中各位的权值(由低到高)是在部分积的逐次移位(右移)中体现出来的,每次新的部分积位出现在乘数和部分积中的低位右移后空出的最高位); 3) 由乘数的末位值确定(即乘数起控制作用)被乘数是否与原部分积相加,然后(部分积)右移1位,形成新的部分积,同时乘数右移1位,由次低位作新的末位,空出最高位放部分积的最低位; 4) 每次做加法,被乘数仅与原部分积的高位(寄存器)相加,原部分积的低位移至乘数所空出的高位位置。 | 乘法运算不会溢出(因为乘法结果用两个寄存器存放,即存放乘法结果的寄存器的位数为存放乘数的寄存器和被乘数的寄存器的位数之和) | ||
原码 | 1) 乘积的符号位与数值位分开运算,结果为原码; 2) 乘积的符号位由被乘数和乘数两原码的符号位异或得到; | |||
一位乘 | 1) 乘积的数值位部分由两数绝对值相乘得到; 2) 乘积数值位的运算过程中的右移均为逻辑右移(因为乘积的数值部分是两数绝对值相乘的结果); 3) 先加后移(实际是在加之前先移位,但第1次加不需要移位,且最后1次移位是为了将进位位移入乘积寄存器中,故总的来看便成了先加后移); 4) 部分积和被乘数均取n+1位(n为被乘数和乘数数值位的位数。多出的一位不是符号位,而是用于存放加法运算时最高位的进位(但此刻并不是溢出),因为乘积的数值位部分是两数绝对值相乘的结果。两个数相加,每位相加后进位值只能为0或1,不会大于1,所以增加1位足矣。) | |||
两位乘 | 1) 乘积数值位部分的运算原理见“表-两位乘数所对应的新的部分积”; 2) 乘积数值位部分的运算规则见“表-原码两位乘数值部分的运算规则”; 3) “表-原码两位乘数值部分的运算规则”中进行-x*运算时,采用加[-x*]补实现,因而参与原码两位乘以计算乘积数值位的操作数(被乘数的绝对值和部分积)是补码;(虽然乘积的符号位是单独确定,而不是在和数值位的一起运算中形成的,但由于参与原码两位乘的操作数是补码,故在数值位的运算过程中,被乘数的绝对值和部分积的符号位还是参与运算的,只不过运算最终得到的部分积的符号位不采用,只使用其数值位作为乘积的数值位) 4) 乘积数值位部分的运算中的加法和移位按补码规则完成; 5) 乘积数值位部分的运算中要加2倍被乘数,即+2[x*]补,使部分积的绝对值大于2(对于纯小数而言,2[x*]补本身可能大于1,再与原部分积相加则可能大于2),因而部分积和被乘数的补码应取3位符号位,且仅以最高符号位作为真正符号位,该最高符号位不参与运算过程中的算术(补码)移位(右移),3位符号位中的低两位作为数值位,参与运算过程中的算术(补码)移位(右移); 6) 参与乘积数值位运算的乘数仅是以其绝对值的形式起控制作用,故不需符号位,但应为偶数位,a)当乘数为奇数位时,乘数的最高位前只需增加1个“0”(添加该“0”后,最高两位至多为“01”,即便它们的前两位将进位Cj置“1”,“01+1”也不需再进位),且最后一步移位只移1位;b) 当乘数为偶数位时,为防止乘数的最高两位出现“11”且需要将进位Cj置“1”,需在最高位前增加2个“0”(添2个0是为了保证乘数为偶数位),最后一步不需移位; | |||
补码 | 1) 乘积的符号位与数值位一起运算,结果为补码; 2) 乘积的符号位在运算中自然形成; 3) 乘积运算中的加法和移位均按补码规则进行; 4) 最后一次加法操作后不移位(因为加法操作之前才移位,且是补码运算,最高位为符号位); | |||
一位乘 | 1) 原理:比较法 ( 2) 规则见“表-补码一位乘的运算规则”; 3) 因符号位参与运算,考虑到运算过程中可能出现绝对值大于1(对于纯小数而言)的情况(但此刻并不是溢出,因为之后可能还会进行右移),故部分积和被乘数补码的符号位取两位,即双符号位,且仅以最高符号位作为真正符号位,该位不参与运算过程中的算术(补码)移位(右移),较低符号位作为数值位,可参与运算过程中的算术(补码)移位(右移); 4) 参与乘积运算的乘数仅是以其补码的形式起控制作用,故不需考虑进位溢出,因而其补码只需1位符号位; | |||
两位乘 | 1) 原理:根据补码一位乘的规则,将比较ynyn+1的状态应执行的操作和比较yn-1yn的状态应执行的操作合并成一步完成; 2) 规则见“表-补码两位乘的运算规则”; 3) 因操作中出现加2[x]补和加2[-x]补,而加2[x]补和加2[-x]补都可能因溢出而侵占双符号位,故部分积和被乘数的补码采用3位符号位,且仅以最高符号位作为真正符号位,该最高符号位不参与运算过程中的算术(补码)移位(右移),3位符号位中的低两位作为数值位,参与运算过程中的算术(补码)移位(右移); 4) 参与乘积运算的乘数仅是以其补码的形式起控制作用,故不需考虑进位溢出,因而其补码只需2位(便于硬件实现)符号位; | |||
除法运算 | 1) 除法运算可用减法和移位来实现(商中各位的权值(由高到低)是在余数的逐次移位(左移)中体现出来的,每次新的商位出现在余数和商中的高位左移后空出的最低位); 2) 定点小数(即纯小数)进行除法运算结果仍为定点小数(即纯小数),否则溢出; 3) 定点整数进行除法运算结果仍为整数, | |||
原码 | 加减交替法 | 1) 商的符号位与数值位分开运算,结果为原码; 2) 商的符号位由被除数和除数两原码的符号位异或得到; 3) “表-原码加减交替法的运算规则”中进行-y*运算时,采用加[-y*]补实现,因而参与原码加减交替法以计算商的数值位的操作数(被除数的绝对值、除数的绝对值和余数)是补码; 4) 商的数值位的运算过程中的左移为逻辑左移(左移采用逻辑左移仅在被除数的绝对值、除数的绝对值和余数的补码采用1位符号位时适用);(由于运算过程过程中可能会出现最高位(即符号位)进位的情况,故被除数的绝对值、除数的绝对值和余数的补码的符号位也可取两位,即双符号位(此时商的数值位的运算过程中的左移可按算术左移处理),且仅以最高符号位作为真正符号位,该位不参与运算过程中的算术(补码)移位(左移),较低符号位作为数值位,参与运算过程中的算术(补码)移位(左移)) 5) 规则见“表-原码加减交替法的运算规则”; 6) 定点小数除法需满足的条件: 定点整数除法需满足的条件: | 1) 定点小数(纯小数):被除数的绝对值大于除数的绝对值时溢出,即第一次上商为1时(表示被除数的绝对值大于除数的绝对值)溢出,也即最终商的符号位为1时(被除数绝对值的原码和除数绝对值的原码均为正,其符号位为0,而商的原码的符号位为1,结果为负)溢出; 2) 定点整数:被除数的高n位比除数(n位)大则溢出(表示商值需超过n位)(被除数为2n位,是除数字长的两倍); | |
补码 | 加减交替法 | 1) 商的符号位与数值位一起运算,结果为补码; 2) 商的符号位在运算中自然形成; 3) 4) 被除数的补码和除数的补码同号时(即商为正),按原码规则上商;被除数的补码和除数的补码异号时(即商为负),按反码规则(前提是商的末位用“恒置1”的舍入规则,因为负数的补码中值为1的最低位及低于它的所有位的取值与原码中相应位的取值相同,高于该值为1的最低位的各位的取值与原码中相应位的取值相反)上商; 5) 规则见“表-补码加减交替法的运算规则”。 | 1) 定点小数(纯小数): 用商符可判断溢出:当[x]补与[y]补同号时,若[R0]补=[x]补-[y]补与[y]补同号,上商“1”表示“够减”(即表示被除数的绝对值大于除数的绝对值),则溢出;当[x]补与[y]补异号时,若[R0]补=[x]补+[y]补与[y]补异号,上商“0”表示“够减”(即表示被除数的绝对值大于除数的绝对值),则溢出; 2) 定点整数: | |
浮点运算 | 加减运算 | 对阶 | 1) 目的:使两浮点数的小数点的位置(相对于小数点真实位置)对齐,即使两浮点数的阶码相等; 2) 原则:小阶向大阶看齐(若大阶向小阶看齐,则大阶的阶码减小,尾数需左移,数值位的高位有可能丢失,影响数据的准确度,而不是精度;若右移,则仅可能影响精度,但不影响准确度); 3) 方法:阶小的尾数(二进制)每算术右移1位,其阶码加1(浮点数的基值为2时;若浮点数的基值为2n,则尾数(二进制)每右移n位,阶码加1); | 1) 阶码[j]补=01.xx…x为上溢(正溢出),按异常处理; 2) 阶码[j]补=10.xx…x为下溢(负溢出),按机器零处理; |
尾数求和 | 对阶后的尾数按定点加(减)运算规则进行运算; | |||
规格化 | 1) 目的:提高浮点数的精度; 2) 原则:若浮点数的基值为2,则尾数S的规格化形式为1/2≤|S|<1。若尾数采用双符号位的补码,则当S>0时,其补码规格化形式为[S]补=00.1xx…x,当S<0时,其补码规格化形式为[S]补=11.0xx…x,即当尾数的最高数值位(浮点数的基值为2时)与符号位不同时,即为规格化形式(当浮点数的基值为2n时,尾数的最高n数值位中至少有1位与符号位不同时即为规格化形式), 特殊情况: a)S=-1/2,则[S]补=11.100…0,满足1/2≤|S|<1,但不满足[S]补=11.0xx…x; b)S=-1,则[S]补=11.000…0,不满足1/2≤|S|<1,但满足[S]补=11.0xx…x; 故为便于硬件判断,对于补码而言,-1/2不是规格化数,-1是规格化数,即当尾数不满足[S]补=00.1xx…x或[S]补=11.0xx…x时,需要规格化; c) S=0,S为规格化数。 3) 方法:浮点数的基值为2时, a) 左规:当尾数出现00.0xx…x或11.1xx…x时,需左规。左规时尾数每左移(按双符号位补码规则算术左移)1位,阶码减1; b) 右规:当尾数出现01.xxx…x或10.xxx…x时,表示尾数溢出(这也是尾数采用双符号位补码的原因),需右规。右规时尾数仅右移(按双符号位补码规则算术右移)1位,阶码加1; | |||
舍入 | 1) 目的:在对阶和右规时(即尾数右移时),提高尾数的精度; (机器零是个逻辑概念,并不一定是(用于存储浮点数各部分的所有)寄存器各位全为0) 2) 方法(对于原码和补码都适用): a) 0舍1入法:尾数右移时,被移去各位中的最高位为0时,则舍去;被移去各位中的最高位为1时,则在尾数的末尾加1,若尾数再次溢出,则再做一次右规;(当每次仅对一位进行舍入处理时(如右规),相当于对由该位及低于该位的各位全为0的位组成的所有位进行舍入处理。同一个负数真值的原码和补码按该规则处理后的结果的真值不再相同,若想得到的结果的真值相同则可采用浮点乘法中的舍入处理方法) b) 恒置1法:尾数右移时,不论丢掉的数值位是“0”或“1”,均使右移后的尾数的末位恒置1。 | |||
溢出判断 | 1) 原则:通过判断阶码是否溢出,来判断浮点数是否溢出(因为阶码表示浮点数的范围,尾数表示浮点数的精度); 2) 方法: 1) 阶码[j]补=01.xx…x为上溢(正溢出),按异常处理; 2) 阶码[j]补=10.xx…x为下溢(负溢出),按机器零处理; | |||
乘法运算 | 阶码相加 | 使用移码表示阶码: | 方法:阶码用移码表示, 在原有移码符号位的前面(即高位)再增加1位符号位,并规定该位初始值恒用“0”表示。运算结果移码的最高位符号位为1,表明溢出,此时若低位符号位为0,表示上溢,低位符号位为1,表示下溢;运算结果移码的最高位符号位为0,表明没有溢出,此时若低位符号位为1,结果为正,低位符号位为0,结果为负。 | |
尾数相乘 | 1) 使用任意一种定点小数的乘法运算; | |||
规格化 | 同加减运算 | |||
舍入 | 尾数相乘会得到一个双倍字长的结果,若限定只取1倍字长,则乘积的若干低位将会丢失。通常用两种方法: 1) 截断处理:即无条件地丢掉正常尾数最低位之后的全部数值;(会影响精度) 2) 按真值的“0舍1入”原则进行舍入处理(同一个真值的原码和补码按如下规则处理后的结果的真值仍相同): A) 原码:采用“0舍1入”法; B) 补码:对于正数,“0舍1入”法,对于负数,则 a) 当丢失的各位中的最高位为1,且以下各位又不全为0时(变为原码即为0XX…X。或,该最高位的1不是补码中值为1的最低位,因而该最高位的1相当于原码中的0),则在保留尾数的最末位加1修正(加1后,补码对应的二进制值变大,补码对应的真值值变小,与原码中的“0舍”相对应); b) 当丢失的各位中的最高位为1,且以下各位全为0时(变为原码即为100…0。或,该最高位的1即为补码中值为1的最低位,因而该最高位的1相当于原码中的1),或丢失中的各位中的最高位为0,且以下各位不全为0时(变为原码即为1XX…X。或,该最高位的0位于补码中值为1的最低位的高位,因而该最高位的0相当于原码中的1),则舍去被丢失的各位(舍去后,补码对应的二进制值变小,补码对应的真值值变大,与原码中的“1入”相对应); c) 当丢失的各位均为0时(变为原码即为000…0。或,丢失的各位中的0均位于补码中值为1的最低位的低位,因而丢失的各位中的0均相当于原码中的0),不必舍入; | |||
溢出判断 | 1) 原则:通过判断阶码是否溢出,来判断浮点数是否溢出(因为阶码表示浮点数的范围,尾数表示浮点数的精度); 2) 方法:阶码用移码表示, 在原有移码符号位的前面(即高位)再增加1位符号位,并规定该位初始值恒用“0”表示。运算结果移码的最高位符号位为1,表明溢出,此时若低位符号位为0,表示上溢,低位符号位为1,表示下溢;运算结果移码的最高位符号位为0,表明没有溢出,此时若低位符号位为1,结果为正,低位符号位为0,结果为负。 | |||
除法运算 | 阶码相减 | 同乘法运算 | 同乘法运算。 | |
尾数相除 | 1) 使用任意一种定点小数的除法运算; 2) 对已经规格化的尾数,为防止除法结果溢出,可先比较被除数和除数的绝对值,若被除数的绝对值大于除数的绝对值,则先将被除数右移1位,其阶码加1,再作尾数相除。此时所得结果必为规格化的定点小数。 | |||
规格化 | 同加减运算 | |||
舍入 | 同加减运算 | |||
溢出判断 | 同乘法运算 |
表-算术移位空位添补规则 | ||
真值 | 码制 | 添补代码 |
正数 | 原码、补码、反码 | 0 |
负数 | 原码 | 0 |
补码 | 左移添0 | |
右移添1 | ||
反码 | 1 | |
说明: 1) 负数的补码中值为1的最低位及低于它的所有位的取值与原码中相应位的取值相同,高于该值为1的最低位的各位的取值与原码中相应位的取值相反; |
表-算术运算中操作数的寄存器分配 | ||||
操作数 | 寄存器 | |||
X | M/Q | A | ||
运算 | 加法 | 加数 | 被加数及和 | |
减法 | 减数 | 被减数及差 | ||
乘法 | 被乘数 | 乘数及乘积(部分积)低位 | 乘积(部分积)高位 | |
除法 | 除数 | 商 | 被除数及余数 | |
说明: 1) 寄存器X中存放的均是表示“单位”性质的数,且在单次运算中其内容不变; 2) 寄存器M/Q中存放的均是表示“个数”性质的数; 3) 寄存器A中存放的均是表示“总量”性质的数,及运算结果相关的数; 4) 乘法运算的乘积为部分积的最终值;除法运算的被除数为余数的初始值; |
表-两位乘数所对应的新的部分积 | |
乘数 | 新的部分积 |
00 | 新部分积等于原部分积右移2位 |
01 | 新部分积等于原部分积加1倍被乘数后右移2位 |
10 | 新部分积等于原部分积加2倍被乘数后右移2位 |
11 | 新部分积等于原部分积加3倍被乘数后右移2位 |
表-原码两位乘数值部分的运算规则 | |||
乘数判断位 | 标志位 | ![]() | 操作内容 |
00 | 0 | 0 |
|
01 | 0 | 1 |
|
10 | 0 | 2 |
|
11 | 0 | 3 |
|
00 | 1 | 1 |
|
01 | 1 | 2 |
|
10 | 1 | 3 |
|
11 | 1 | 4 |
|
表-补码一位乘的运算规则 | ||
![]() | ![]() | 操作内容 |
00 | 0 | 部分积右移一位 |
01 | 1 | 部分积加 |
10 | -1 | 部分积加 |
11 | 0 | 部分积右移一位 |
表-补码两位乘的运算规则 | ||
判断位 | 分步说明 | 操作内容 |
000 | ![]() | ![]() |
001 | ![]() | ![]() |
010 | ![]() | ![]() |
011 | ![]() | ![]() |
100 | ![]() | ![]() |
101 | ![]() | ![]() |
110 | ![]() | ![]() |
111 | ![]() | ![]() |
表-原码加减交替法的运算规则 | |||
余数 | 上商 | 新余数计算 | 新余数 |
![]() | 1 | ![]() | ![]() |
![]() | 0 |
| ![]() |
说明: 1) 上商是根据余数的正负来决定的,即若余数为正表示够减,应上商1,若余数为负表示不够减,应上商0,即余数(被除数)减除数是在每次上商前完成的,是上商的依据。 2) 虽然Ri<0时,新余数的计算公式“Ri+1=2Ri+[y*]补”中也有和原码恢复余数法中Ri<0时相同的操作“+[y*]补”,但此处的“+[y*]补”不是恢复余数,而是“2Ri+[y*]补”整体作为“恢复余数”和“余数左移后再次减去除数”两步操作综合的等价形式,只有在原码加减交替法的最后一步余数小于零时才会用到“恢复余数”的操作,即“+[y*]补”(若最后一步余数不小于零,则不执行“恢复余数”的操作)。 |
表-补码加减交替法新余数的确定 | ||
比较[x]补与[y]补的符号 | 求余数 | 比较[Ri]补与[y]补的符号 |
同号 | [x]补-[y]补 | 同号(即[Ri]补与[x]补同号),表示“够减” |
异号 | [x]补+[y]补 | 异号(即[Ri]补与[x]补同号),表示“够减” |
说明:被除数与除数同号时,做减法求余数;被除数与除数异号时,做加法求余数; |
表-补码加减交替法商值的确定 | |||
[x]补与[y]补 | 商 | [R]补与[y]补 | 商值 |
同号 | 正 | 同号(即[R]补与[x]补同号),表示“够减” | 1(原码规则上商) |
异号(即[R]补与[x]补异号),表示“不够减” | 0(原码规则上商) | ||
异号 | 负 | 异号(即[R]补与[x]补同号),表示“够减” | 0(反码规则上商) |
同号(即[R]补与[x]补异号),表示“不够减” | 1(反码规则上商) | ||
说明: 1) 上述商值的确定规则仅适用于商的末位使用“恒置1”的舍入规则的情况。 |
表-补码加减交替法的运算规则 | ||
[Ri]补与[y]补 | 商 | 新余数[Ri+1]补 |
同号 | 1 | [Ri+1]补=2[Ri]补+[-y]补 |
异号 | 0 | [Ri+1]补=2[Ri]补+[y]补 |
运算步骤:求余->上商->移位(商和余数)。 |
文章合集:
点击下方公众号主页,关注以阅读更多文章
——可选择“【右上角···】→【在浏览器中打开】”进行横屏阅读。





















































