1. 程式人生 > >【重學計算機】計組D3章:運算方法與運算器

【重學計算機】計組D3章:運算方法與運算器

相加 -i 溢出檢測 計數 line 二進制 com 浮點 ...

1. 定點數運算及溢出

定點數加減法:減法化加法,用補碼直接相加,忽略進位

溢出:運算結果超出了某種數據類型的表示範圍

溢出檢測方法:統一思想概括為正正得負或負負得正則溢出,正負或負正不可能溢出

  方法1:V = XYS + XYS(XY為兩個加數的符號位,S為結果的符號位,_表示非),那麽V = 1則為溢出

  方法2:V = C0 ⊕ C1(C0是最高數據位產生的進位,C1是符號位產生的進位),那麽V = 1則為溢出

  方法3:V = Xf1 ⊕ Xf2(數據采用變型補碼 Xf1Xf2 X0X1X2X3...

PS:以上方法都是利用正正得負負負得正則溢出為出發點的電路設計

2. 補碼一位乘法——Booth算法

[x·y] = [x]·( -y0+∑ yi2-i )

    = [x]·[ - y0 + y12-1 + y22-2 + … + yn2-n]

    = [x]·[ - y0 + (y1 - y12-1) + (y22-1 - y22-2) + … + (yn2-(n-1) - yn2-n)]

    = [x]·[(y1 - y0) + (y2 - y1) 2-1 + … + (yn - yn

-1) 2-(n-1) + (0 - yn)2-n]

總結起來設計數字電路的規則就是:

  • 為00或者為11的時候,直接右移一位
  • 為01的時候,加x的補,然後右移一位
  • 為10的時候,加-x的補,然後右移一位

PS:其實第一行和最後一行都能設計數字電路,為什麽要從第一個式子推到最後一個式子呢?原因有兩點:

  1)二進制中如果有0,可以不進行運算

  2)如果有連續的1可以減少計算次數,比如 a * 001111100 = a * (010000000 - 0000000100)

所以每次判斷 yn+1 - yn就可以減少計算次數了

參考:https://www.cnblogs.com/xisheng/p/9260861.html

3. 定點數除法

--- 略,沒找到好的資料

4. 浮點數加減法

  (1)求階差,階碼小的對齊大的

  (2)尾數加減

  (3)結果規格化

【重學計算機】計組D3章:運算方法與運算器