表-计算机的运算方法 |
表示 | 运算 | 实现 | 规则 | 溢出判断 |
定点(整数和纯小数)运算 | 移位运算 | 逻辑移位(无符号数) | 1) 移丢; 2) 空位添0。 | 高位移丢1,结果出错;低位移丢1,影响精度。 |
算术移位(有符号数) | 1) 符号位不变(即符号位不参与运算); 2) 移丢; 3) 空位添补(见“表-算术移位空位添补规则”)。 4) 对于双(或3)符号位的补码,最高位符号位为真正符号位,不参与移位,除最高位符号位外的其他低位符号位参与移位,其他同补码。 | 1) 原码:(数值位)高位移丢1,结果出错;低位移丢1,影响精度; 2) 补码:(数值位)高位移丢0,结果出错;低位移丢1,影响精度; 3) 反码:(数值位)高位移丢0,结果出错;低位移丢0,影响精度; |
加减运算 | 减法运算可以看做被减数加上减数的负值,即 ,加法与减法运算统一为加法运算。 | |
原码 | 和的符号位与数值位分开运算,结果为原码。 | |
补码 | 1) 和的符号位与数值位一起运算,结果为补码; 2) 和的符号位产生的进位丢掉(即取模); 3) 补码加法基本公式: a) 整数: ,(A,B均为n+1位,包括符号位在内); 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) 原理:比较法 ,上述等式是对校正法 (y为正数); (y为负数, 由y的补码的符号位取反得到)的改进, 是校正项。 ( (因为可由“连同符号位在内,每位取反,末位加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) 定点小数除法需满足的条件: , 定点整数除法需满足的条件: ;(除数不为0,是因为为0时结果为无穷大,无法用机器的有限位表示,会导致异常;被除数不为0是因为为0时结果恒为0,无需进行除法运算浪费计算时间,可直接返回结果。两个条件不等式中右侧“≤”不等式即为除法溢出判断的条件)。 | 1) 定点小数(纯小数):被除数的绝对值大于除数的绝对值时溢出,即第一次上商为1时(表示被除数的绝对值大于除数的绝对值)溢出,也即最终商的符号位为1时(被除数绝对值的原码和除数绝对值的原码均为正,其符号位为0,而商的原码的符号位为1,结果为负)溢出; 2) 定点整数:被除数的高n位比除数(n位)大则溢出(表示商值需超过n位)(被除数为2n位,是除数字长的两倍); |
补码 | 加减交替法 | 1) 商的符号位与数值位一起运算,结果为补码; 2) 商的符号位在运算中自然形成; 3) 运算中的加法和移位均按补码规则进行;运算过程中的左移为逻辑左移(左移采用逻辑左移仅在被除数(余数)和除数的补码采用1位符号位时适用);(由于运算过程过程中可能会出现最高位(即符号位)进位的情况,故被除数(余数)和除数的补码的符号位也可取两位,即双符号位(此时运算过程中的左移可按算术左移处理),且仅以最高符号位作为真正符号位,该位不参与运算过程中的算术(补码)移位(左移),较低符号位作为数值位,参与运算过程中的算术(补码)移位(左移)) 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为下溢(负溢出),按机器零处理; |
乘法运算 | 阶码相加 | 使用移码表示阶码: ([jy]补可由[jy]移“符号位取反”得到,且[-jy]补可由[jy]补“连同符号位在内,每位取反,末位加1”得到) | 方法:阶码用移码表示, 在原有移码符号位的前面(即高位)再增加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,再作尾数相除。此时所得结果必为规格化的定点小数。 |
规格化 | 同加减运算 |
舍入 | 同加减运算 |
溢出判断 | 同乘法运算 |