天天看點

原碼,反碼和補碼

計算機由0,1組成的資料要如何表示負數有如下三種方式:

  • 原碼:将整數的最高位設為符号位(為1則為負,為0則為正),剩下的位表示整數的絕對值,其取值範圍為

    -(2^k-1)-1 ~ +(2^k-1)-1

  • 反碼:将整數的最高位設為符号位(為1則為負,為0則為正),且當表示負數時,将除符号位的所有位數進行反轉(即0變為1,1變為0),其取值範圍為

    -(2^k-1)-1 ~ +(2^k-1)-1

  • 補碼:将整數的最高位設為符号位(為1則為負,為0則為正),且當表示負數時,将正數減1,然後反轉每一位,其取值範圍為

    -(2^k-1) ~ +(2^k-1)-1

個人思考:原碼有符号位來表示正負足矣了,為什麼反碼和補碼又要反轉又要減1呢?以下《計算機體系結構精髓》裡的描述。

① 原碼,反碼和補碼每種都有有趣的特性。例如,原碼可以建立一個負的零值,即使這個概念不能對應一個有效的數學概念。反碼也提供了兩個零值:所有位全0和它的補碼(所有位全1)。最後,補碼正值比負值多了一個(為了容納零)。

三種表示法至少都被一台計算機使用過。但在硬體架構中

補碼方案是最常用的

,原因有二:

  1. 補碼使得建構低成本,高速度的硬體執行算術運算成為可能
  2. 其次,二進制補碼算法的硬體也可以處理無符号的算術。
二進制串 無符号位權解釋 原碼解釋 反碼解釋 補碼解釋
0000
0001 1 1 1 1
0010 2 2 2 2
0011 3 3 3 3
0100 4 4 4 4
0101 5 5 5 5
0110 6 6 6 6
0111 7 7 7 7
1000 8 -0 -7 -8
1001 9 -1 -6 -7
1010 10 -2 -5 -6
1011 11 -3 -4 -5
1100 12 -4 -3 -4
1101 13 -5 -2 -3
1110 14 -6 -1 -2
1111 15 -7 -0 -1

如上圖所述,補碼的優勢如下:

  1. 無符号和補碼的優點在除非溢出,否則相同的硬體操作對于兩種表示都是有效的。例如,1001加1會産生1010,在無符号中,1加9等于10;在補碼中,給-7加一就産生-6。

    是以計算機可以使用單個硬體電路來提供無符号或補碼整數運算;運作在計算機上的軟體可以為每個整數選擇一個解釋

  2. 補碼相對反碼和原碼來說,同樣的位數下,負數可以多一種解釋。

繼續閱讀