跳转至

计算机中数的运算方法

算数移位与逻辑移位

算数移位

算数移位规则

  • 符号位不变
  • 机器数的移位与真值移位一致

img

正数移位均补0,负数原码均补0,负数补码高位补1,反码都补1

算数移位和逻辑移位的区别

  • 算数移位:有符号数的移位
  • 逻辑移位:无符号数的移位
    • 逻辑左移:低位添0,高位丢弃
    • 逻辑右移,高位添0,低位丢弃

例:补码表示的机器数10110010

逻辑左移:01100100 逻辑右移:01011001
算数左移:11100100 算术右移:11011001

例:设机器数字长8位(含1为符号位),当A=+26时,三种机器数左、右移一位和两位后的表示形式以及对应的真值

\[A=+26=+11010\]

\([A]_原=[A]_补=[A]_反=0,0011010\)

移位操作 机器数 对应的真值
0,0011010 +26
左移一位 0,0110100
右移一位 0,0001101
左移两位 0,1101000
右移两位 0,1100110

定点运算

定点加减法运算(补码)

  • 加法
    • 整数:\([A]_补+[B]_补=[A+B]_补\)
    • 小数:\([A]_补+[B]_补=[A+B]_补\)
  • 减法:\(A-B=A+(-B)\)
    • 整数:\([A-B]_补=[A+(-B)_补]=[A_补]+[-B]_补\)
    • 小数:\([A-B]_补=[A+(-B)_补]=[A_补]+[-B]_补\)

连同符号位一起相加,符号位产生的进位自然丢掉

例:设A=0.1011,B=-0.0101,用补码运算求A+B=?

解答

已知\([X]_补\),可以通过:包括符号位在内,每位取反,末位加1求出\([-X]_补\)

例:已知机器数长为8位(包含1位符号位),设A=15,B=24,用补码求解A-B

解答

例:已知机器数长为8位(包含1位符号位),设A=-97,B=41,用补码求解A-B

解答 有$[A]_补+[-B]_补=10,1110110=[A-B]_补$,有$A-B=+118$(溢出)

一位符号位判定溢出

  • 参加加法的两个数(减法时+减数相反数的补码)
    • 如果符号不同,不会溢出
    • 如果符号相同,其结果的符号与原操作数的符号不同,即为溢出
\[\begin{cases}最高有效位进位\oplus 符号位进位=1&溢出\\最高有效位进位\oplus 符号位进位=0&不溢出\end{cases}\]

两位符号位判断溢出

  • 小数变形补码
  • 整数变形补码

  • 最高符号位代表其真正的符号

  • 结果的双符号位相同 未溢出
  • 结果的双符号位不同 溢出

设机器数字为9位(含2位符号位),且\(A=-97,B=41\),用补码求\(A-B\)

解答

乘法运算

原码一位乘法运算规则

  • 整数:设\([X]_原=X_nX_{n-1}\dots X_1X_0,[Y]_{原}=Y_nY_{n-1}\dots Y_1Y_0\)
\[[X\times Y]_原=(X_n\oplus Y_n)(0X_{n-1}\dots X_1X_0\times 0Y_{n-1}\dots Y_1Y_0)=(X_n\oplus Y_n)(|X|\times |Y|)\]
  • 小数:设\([x]_原=x_0\cdot x_1x_2\dots x_n,[y]_原=y_0\cdot y_1y_2\dots y_n\)
\[[x\times y]_原=(x_0\oplus y_0)\cdot(0.x_1x_2\dots x_n\times 0.y_1y_2\dots y_n)=(x_0\oplus y_0)(|x|\times|y|)\]

乘积的符号位单独处理数值部分绝对值相乘

补码一位乘法运算规则(小数)

设被乘数\([x]_补=x_0\cdot x_1x_2\dots x_n\),乘数\([y]_补=y_0\cdot y_1y_2\dots y_n\)

  • 被乘数任意,乘数为正(类似原码乘)
    • 但加和移位按补码规则运算,积的符号自然形成
  • 被乘数任意,乘数为负
    • 乘数\([y]_补\),去掉符号位,操作同上,最后加上\([-x]_补\),校正
\[\begin{split}[x]_补\times [y]_补=[x]_补\times(1.0_1\dots 0_n + 0.y_1y_2\dots y_n)_补 \\ =[x]_补\times[0.y_1y_2\dots y_n]_补-[x]_补\\ =[x]_补\times [0.y_1y_2\dots y_n]_补+[-x]_补 \end{split}\]

补码一位乘法运算规则(整数)

设被乘数\([X]_补=X_n\dots X_1X_0\),乘数\([Y]_补=Y_n\dots Y_1Y_0\)

  • 被乘数任意,乘数为正(类似原码乘),但加和移位按补码规则运算,积的符号自然形成
  • 被乘数任意,乘数为负,乘数\([y]_补\),去掉符号位,操作同上,最后加\([–x]_补\),校正
\[\begin{align*}&[X]_补\times [Y]_补=[X]_补\times [10_1\dots 0_n+0Y_{n-1}\dots Y_1Y_0]_补 \\ &=[X]_补\times [0Y_{n-1}\dots Y_1Y_0]_补+(-2^n)[X]_补 \\ &=[X]_补\times [0Y_{n-1}\dots Y_1Y_0]_补+2^n[-X]_补 \end{align*}\]

booth算法(小数,被乘数、乘数符号任意)

设x和y的补码表示分别为\([x]_补=x_0.x_1x_2\dots x_n,[y]_补=y_0.y_1y_2\dots y_n\)

\[\begin{align*}&[x\times y]_补=[x]_补\times[0.y_1y_2\dots y_n+y_0.0_10_2\dots 0_n]_补 \\ &=[x]_补(0.y_1y_2\dots y_n)+ [x]_补\times (-y_0)\\&=[x]_补[-y_0+(y_1 2^0-y_1 2^{-1})+(y_2 2^{-1}- y_2 2^{-2})+\dots+(y_n2^{-(n-1)}-y_n2^{-n})] \\&=[x]_补[(y_1-y_0)+(y_2-y_1)2^{-1}+\dots+(y_n-y_{n-1})2^{-(n-1)}+(y_{n+1}-y_{n})2^{-n}]\\&=(y_1-y_0)[x]_补+2^{-1}\{(y_2-y_1)[x]_补+2^{-1}\{(y_3-y_2)[x]_补\dots+2^{-1}\{y_{n+1}-y_n\}\dots\}[x]_补+0\}\}\end{align*}\]

booth小数算法递推公式

img

booth算法(整数,被乘数、乘数符号任意)

设X和Y的补码表示分别为\([X]_补=X_n,X_{n-1}\dots X_0,[Y]_补=Y,Y_{n-1}\dots Y_0\)

\[\begin{align*}& [X\times Y]_补=[X]_补[0Y_{n-1}\dots Y_0+Y_n0_{n-1}0_{n-2}\dots 0_0]_补\\ & =[X]_补(0Y_{n-1}\dots Y_0)+[X]_补\times [Y_n0_{n-1}0_{n-2}\dots 0_0]_补 \\ & =2^n*([X]_补(Y_{n-1}2^{-1}+Y_{n-2}2^{-2}+\dots +Y_02^{-n})+[X]_补\times[Y_n0_{n-1}0_{n-2}\dots 0_0]_补)\\&=2^n*(Y_{n-1}-Y_n)[X]_补+2^{-1}\{2^n*(Y_{n-2}-Y_{n-1})[X]_补+2^{-1}\{2^n(Y_{n-3}-Y_{n-2})[X]_补\dots + 2^{-1}\{2^n*(Y_{-1}-Y_0)[X]_补+0\}\dots \}\}\end{align*}\]

booth整数递推公式

img

乘法器硬件示意图

展开

除法运算

img

分析笔算除法

  • 商符单独处理
  • 心算上商
  • 部分余数不动低位补0
  • 如果部分余数大于除数,则减右移的除数
  • 上商位置不固定

恢复余数法

符号位单独处理,取除数和被除数绝对值进行运算

  1. 余数(被除数)减去除数\([y^*]_补(+[-y^*]_补)\to 余数\)
  2. if 余数为负(不够减)
    • then 商上0,余数+[y*]补(恢复余数)
    • else (够减) 商上1
  3. if 循环次数<数据位数n
    • then 余数逻辑左移一位,加[-y*]补 ;重复步骤2

不恢复余数法(加减交替)

  • 余数为正,上商1,逻辑左移1位,+[– y*]补
  • 余数为负,上商0,逻辑左移1位,+[ y*]补

浮点运算

浮点四则运算(对阶、尾数求和、规格化、舍入)

\(x=S_x\cdot 2^{j_x}\quad y=S_y\cdot 2^{j_y}\)

  • 对阶:使两个浮点数的阶码相同
    • 求阶差
    • 对齐原则:小阶向大阶看齐

左规和右规

  • 原码规格化判断方法:不论正数、负数,第一数位为1
  • 补码规格化判断方法:符号位和第一数位不同
  • 补码左规:尾数每左移1位,阶码减1,直到数符与第一数位不同
  • 右规:当(小数)尾数溢出( >1)时,需 右规