計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。
三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”;
而數值位,三種表示方法各不相同。
在計算機系統中,數值一律用補碼來表示和存儲。
原因在於,使用補碼,可以將符號位和數值域統一處理,同時,加法和減法也可以統一處理。
接下來,來看一看原碼、反碼和補碼到底是什么,以及它們之間的轉換關系。
原碼:
是一種計算機中對數字的二進制定點表示方法。
原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0 和 -0),其余位表示數值的大小。
現在用4個bit(也就是1個byte)表示數字1:
0 0 0 1 (也就是十進制的1)
因為它是正數,所以它的第一位(也就是它的符號位)是 0,剩下的部分(也就是0 0 1)作為數值進行計算,結果是1。
那么 -1 怎么表示呢?
剛剛說到,第一位為符號位,而負數的符號位是1,那么這里的 -1 就可以寫成:
1 0 0 1
反碼:
0以及正數的反碼就是其本身,也就是說0的反碼還是0,一個正數的反碼還是這個正數自身。
而負數則不同,負數的反碼,除了第一位符號位不變(還是 1 ),其余各位取反,這樣就得到了它的反碼。
那么 -1 的反碼是多少呢?
1 0 0 1【原碼】
1 1 1 0 【反碼】
解析:001各位取反就是110。
補碼:
- 對負數的原碼取反,再加1,這樣就得到了它的補碼。
- 也就是說對負數的反碼加1,就得到了它的補碼。
- 正數的補碼還是其本身。0的補碼還是0。
還是以 -1 舉例子,它的補碼是多少呢?
1 0 0 1【原碼】
1 1 1 0【反碼】
反碼加1之后,1110 + 1 = 1111 也就得到-1的補碼:
1 1 1 1【補碼】
問:在字長為8位的計算機中,-10的原碼、反碼、補碼分別是多少?
解答:
(1)10的原碼為0000 1010,第一位變為1,得到負數-10。
1000 1010【原】
解析:第一位是符號位(-),剩余部分求值:0*20 + 1*21 + 0*22 + 1*23 = 0 + 2 + 0 + 8 = 10
(2)取反得到反碼:
1111 0101【反】
解析:0變1,1變0。
(3)加1得到補碼:
1111 0110【補】
解析:1111 0101 + 1 = 1111 0110
總結:
補碼是計算機系統存儲數據的方式,也就是說它的計算實際上都是以補碼的方式進行的。
我們所輸入的指令是我們看得懂的原碼,但是輸入計算機時,它會自動解析為補碼進行運算。
那么補碼的優勢在哪里呢?
第一,解決了符號的表示的問題;
第二,可以將減法運算轉化為補碼的加法運算來實現,克服了原碼加減法運算繁雜的弊端,可有效簡化運算器的設計;
第三,在計算機中,利用電子器件的特點實現補碼和真值、原碼之間的相互轉換,非常容易;
第四,補碼表示統一了符號位和數值位,使得符號位可以和數值位一起直接參與運算,這也為后面設計乘法器、除法器等運算器件提供了極大的方便。
總之,補碼概念的引入和當時運算器設計的背景不無關系,從設計者角度,既要考慮表示的數的類型(小數、整數、實數和復數)、數值范圍和精確度,又要考慮數據存儲和處理所需要的硬件代價。
因此,使用補碼來表示機器數並得到廣泛的應用,也就不難理解了。
(本文參考資料:https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin)