詳解計算機運算 之 補碼

數據在計算機中的存儲並非我們在物理世界見到的那樣,由於計算機只能存儲二進制數,因此需要將十進制數轉換成二進制數再進行存儲,而轉換後的二進制數的運算也面臨許多問題,因此引入了反碼和補碼的概念!

在微機中,凡是有符號數都是採用補碼錶示,所以運算的結果也是用補碼錶示的。



爲什麼引入補碼的概念呢?

因爲在計算機中,對於二進制的算術運算可以將乘法運算轉換爲加法和左移運算,而除法則可轉換爲減法和右移運算,故加、減、乘、除運算最終可歸結爲加、減和位移 3種 操作來完成。

但在計算機中爲了節省設備,一般只設置加法器而無減法器,這就需要將減法運算轉化爲加法運算,從而使計算器中的二進制四則運算最終變成加法和位移兩種操作。

引入補碼運算就是用來解決將減法運算轉化爲加法運算的。



數據的表示:基數 & 權

無論哪一種進制數的表示,都是由 基數和權的組合,

計算機中的符號數有3種表示方法,即 源碼、反碼、補碼,它們均是由符號位和數值部分組成;

  • 符號位的表示方法相同:即 1表示負數,0表示 正數



1、原碼

[X]={X0X2n1X=2n1+XX0\qquad \qquad [X]_原 = \begin{cases} X \qquad \qquad\qquad\qquad\qquad \quad 0 \leq X \\ 2^{n-1} - X =2^{n-1} + |X| \qquad X \leq0 \end{cases}

  • 機器數的最高位爲符號位:0表示正號,1表示負號,其他部分是數的絕對值;

  • 源碼錶示中的 0 有兩種不同的表示形式,即 +0 和 -0;
    [+0]=00000000[+0]_原 = 0000\quad 0000
    [0]=10000000[-0]_原 = 1000\quad 0000

  • 原碼錶示法的優點是:簡單、易於理解,與真值間的轉換較爲方便,用原碼實現乘除運算的規則比較簡單;

  • 原碼錶示法的優點是:進行加減運算時比較麻煩,要比較加減運算的兩個數的符號、兩個數的絕對值的大小,還要確定運算結果的正確的符號等;



2、反碼

真值 X 的反碼記爲 [X][X]_反

[X]={X0XX+{2n1}X0\qquad \qquad [X]_原 = \begin{cases} X \qquad \qquad\qquad \quad 0 \leq X \\ X+ \{ 2^{n} -1 \} \qquad X \leq0 \end{cases}

  • 對於正數而言,其表示方法同原碼一樣,即數值部分與真值相同;
  • 對於負數而言,其反碼的數值部分爲真值的各位按位取反;

反碼的性質:

  • 在反碼錶示法中,機器數的最高位是符號位,0表示正數,1表示負號;

  • 反碼運算很不方便,數值 0 的表示也不唯一,因此在處理器中很少使用;

  • 同原碼一樣,數0 也有兩種表示形式;
    [+0]=00000000[+0]_反 = 0000\quad 0000
    [0]=11111111[-0]_反 = 1111\quad 1111



3、補碼

真值 X 的補碼記爲 [X][X]_補

[X]={X0X2nXX0\qquad \qquad [X]_補 = \begin{cases} X \qquad \qquad\qquad \quad 0 \leq X \\ 2^{n} - |X| \qquad \qquad X \leq0 \qquad\end{cases}

  • 與原碼和反碼的表示法相同,機器數的最高位是符號位,0表示正號,1表示負號;

  • 正數的補碼與它的原碼相同;而反碼的補碼等於其符號位不變,數值部分的各位按位取反 再加1;

  • 數 0 的補碼錶示法是唯一的;
    [+0]=00000000[+0]_補 = 0000\quad 0000
    [0]=[0]+1=11111111+1=00000000[-0]_補 = [-0]_反 +1 =1111\quad 1111 +1 = 0000 \quad 0000
    SO [+0]=[0]=00000000\qquad[+0]_補 = [-0]_補 = 0000 \quad 0000

  • 對於8進制數而言,其取值範圍是 -128 —+127;



4、補碼的運算

  • 補碼的加法規則:[X+Y]=[X]+[Y][X+Y]_補 = [X]_補 + [Y]_補
  • 補碼的減法規則:[XY]=[X][Y]=[X]+[Y][X-Y]_補 = [X]_補 - [Y]_補 = [X]_補 + [-Y]_補

注:
[Y][-Y]_補 稱爲對補碼數 [Y][Y]_補 求變補;

變補的規則爲:

  • [Y][Y]_補 的每一位(包括符號位)按位取反加 1,則結果就是 [Y][-Y]_補
  • 當然,也可以直接對 Y-Y 求補碼,結果是一樣的。

有符號數運算時的溢出判斷

咋兩個有符號數進行加減運算時,如果運算結果超出上述可表示的有效範圍,就會發生溢出,使計算結果出錯。

判斷有符號數相加或異符號數相減時:

  • 如果次高位向最高位有進位(借位),而最高位向上無進位(借位),則結果發生溢出;
  • 反過來,如果次高位向最高位無進位(借位),而最高位向上有進位(借位),則結果也發生溢出;

對於 8位 二進制數,若 D6D_6 位產生的 進位(借位)記爲 C6C_6D7D_7 位產生的進位(借位)記爲 C7C_7,那麼:

  • 在兩個帶符號二進制數相加或相減時,若 C6C7C_6 \oplus C_7 則結果產生溢出(\oplus 是異或);
    無符號數 與 有符號數產生溢出的條件因各自可表示數的範圍不同而不同。
  • 無符號數的溢出判斷僅看最高位向上是否有進位(借位);
  • 有符號數的溢出判斷需要看次高位和最高位 兩位的進位(借位)情況;
    兩位都產生進位(借位)或都沒有產生進位(借位),則結果無溢出;
    其中只有一位產生了進位(借位),則結果產生溢出,計算結果不正確;

運算時產生溢出,其結果肯定不正確,計算機對溢出的處理,一般是產生一箇中斷,通知用戶採取某種措施;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章