计算机加减乘除及溢出情况(定点数)


链接:《深入理解计算机系统》第二章:整数的运算_Turbo码先生-CSDN博客

机器数及运算表示全部使用补码

定点数:

参考链接:

  https://blog.csdn.net/limanjihe/article/details/52440544

漫谈计算机组成原理(九)定点数及定点数的运算 - 云+社区 - 腾讯云 (tencent.com)

定点数的位移运算

移位运算的规则:虽然正数和负数的移位运算规则不相同,但是相同之处在于移位后正数和负数的符号不变。那么规则就变成了移位运算时,符号位不动,数值位按照如下规则进行移位。

 

 

 

无符号整数

溢出情况:(有且仅有正溢出)超出最大表达范围即溢出

例:8位机器数 表达范围:0-255  如果计算的结果超过了这个范围,则会出现溢出现象,最高位无法表达,导致比其中一个加数小

带符号整数

溢出情况:

如何判断有符号数是否发生溢出现象:
1、两个正数相加得到一个负数,则说明发生了正溢出
2、两个负数相加得到一个正数,则说明发生了负溢出

正溢出:

两正数的数值部分相加产生进位到符号位,导致最终的得到的数是负数,导致出现错误

例:127 + 1 = 128 机器数表示 :0111,1111 + 0000,0001 = 1000,0000

负溢出:

例:-128 + -1 = -129 机器数表示 1000,0000 + 1111,1111 = 1,0111,1111(第一位舍去无法表示)

溢出判断方法:(溢出只可能两个正数相加或者两个负数相加)

(1)用一位符号位判断溢出:判断结果的符号位是否与两个操作数的符号位相同,如果不同,则发生溢出

(2)利用数据编码的最高位(符号位)和次高位(数值部分的最高位)的进位状况来判断运算结果是否发生了溢出:

如果进位情况是00,则无溢出;为01,则发生溢出; 为10,则发生溢出;为11,则无溢出

(3)采用双符号位补码进行判断:

正常时两个符号位的值相同,在运算结果中当两个符号位不同时则表明发生了溢出。运算结果的符号位为01表明两个正数相加,结果大于机器所能表示的最大正数,称为上溢;运算结果的符号位为10表明两个负数相加,结果小于机器所能表示的最小负数,称为下溢。也就是说,两个正数相加,数值位不应向符号位同时产生进位,使得结果数的符号位和操作数的一样,为00

例子:

(-10)+(-7)=(-17)

用机器数表示为 11 0110 + 11 1001 = 10 1111 发生溢出

 3 + 2 = 5

用机器数表示为00 0011 + 00 0010 = 00 0101

 

乘法:

乘法相当于变为移位运算和求和运算,相当于将乘数B从低位到高位乘下来,部分积从零开始累加,并且右移一位(相当于乘了个1/2)

(注意,符号位相当于进行了异或运算,相同为0,相异为1,不参与后面的数值部分计算)

原码乘法:

 

补码乘法:Booth算法(被乘数,乘数符号任意) 一般用于带符号数乘法

这个的原理证明还是慢慢看吧,先大概把怎么用搞懂

计算规则:

 

A补 指累加的部分积

例:

 

 x = -0.1101  y = -0.1011

A = 00.0000 ,B = [x]补 = 11.0011  -B = -[x]补 = 00.1101    C = [Y]补 = 1.0101

在第一步之前,需要在C的最低位补上一个0(为什么),使得C = 101010

第一步

 判断C中最低两位的数 10,所以减去B,等于加上-B

此时A = 000000+001101=00 1101       C = 10 1010 (先不动,后面统一右移)   右移操作:

由于是双符号位表示,则需要将A中第二符号位右移,使其先暂时保持空缺,同时A中最低位右移到C最高位,如图所示

 

对A而言,当前是补码正数,所以在空缺的位置补0

第二步:判断C中最低两位的数,01,所以+B

A = 000110 + 110011 = 111001   C = 110101

整体右移一位: A此时是补码负数,所以在空缺位置补1

 

 

 

第三步:

 

  判断C中最低两位的数 10,所以减去B,等于加上-B

 A = 111100 = 001101 = 1 001001    C = 111010

这个地方1 是超出范围的,1不计,再整体右移

这里A为补码正数,所以在空缺位置补0

 

 

第四步 

 判断C中最低两位的数,01,所以+B 

A= 000100 + 110011 = 110111  C= 111101

整体右移,然后A补1 

 

 

共四次循环,

开始校正: 此时C最低两位为10,因此要-B

A = 111011 + 001101 = 1 001000(最高位舍去)     C = 111110 ,这个时候不需要移位了

考虑到乘数C的底两位只是用来参考位判断,所以只取C的前四位

最后得 z = 001000 1111 由于最高得两位是符号判断位,所以最终

z = + 0.1000 1111

 

除法:

原码恢复余数法:

规则:将被除数-除数,
结果大于0,商1,余数左移一位。
结果小于0,商0,恢复余数,余数左移一位。
重复上述操作,直至商的精度满足要求为止。

本质上来说,不恢复余数法是只是为了在计算的时候能够不判断除数和余数的大小而规定的一种算法,每一次只需要先减就是了,减完了以后,再通过双符号位判断上商为0还是1,然后再判断是否要恢复余数

参考链接:考研计组 | 原码(不)恢复余数除法、补码不恢复余数除法_⊳ideal world⊲~ヽ(゚︺゚)Hi-CSDN博客_不恢复余数法

 

原码不恢复余数法:

与恢复余数法的区别:
若余数(被除数)为负,表示不够减,商上0,恢复余数(加上除数) ,左移一位,加上[-y]_补 , 加上[ y ] 补 [y]_补[y]  链接同上

 

 

补码除法:

 

 

例子:(必须满足被除数绝对值小于除数绝对值)

x / y = + 0.1000 / (-0.1010) = ?

R = X[补] = 00 1000       B=Y[补] = 110110       -B = 001010        商Q= 00000

步骤:

因为余数在每次运算后都要被不断置为被除数,所以初始化r = X【补】

第一步:

当前余数是正数,是双符号位,而Y的补码是负号,所以需要上商为0,然后向左移动余数和商各一位,因为是补码的双符号位移位, 其中,余数最高位移动到第二符号位,商的最高位移动到余数最低位,然后进行+B的操作

 得到 R = 01 0000 + 11 0110 = 1 000110      然后将 被除数赋值给余数 得到  r = 000110       Q = 00000

 

 


第二步:

当前除数和r1异号,因此在Q末尾上0, 然后向左移动余数和商各一位,  其中,余数最高位移动到第二符号位,商的最高位移动到余数最低位,然后进行+B的操作

得到R = 001100 + 110110 = 1 000010    然后将 被除数赋值给余数 得到  r = 000010  Q = 00000

 

 

第三步:

同上,商继续上0 ,基本操作同上:得

R = 111 010    商 Q = 00000

 

 第四步:

因为余数和y补同号, 所以上商1 ,然后整体左移一位,按照之前的规则上位,并且-B(相当于+【-B】补码)

得 余数 = 111110,  商Q = 0001

 

 除数的位数只有四位,因此循环完成:

商校正:商的最高位+1(取反),最低位置1, 最终得到 Q = 10010

余数校正:余数在运算过程中左移了四位,因此需要将其缩小到原来的 2^(-4), 最终得到r = 2^(-4) * r4

 

浮点数

链接:计算机组成原理——浮点数的加减法_豪满天下的博客-CSDN博客

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM