計算機由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)。最後,補碼正值比負值多了一個(為了容納零)。
三種表示法至少都被一台計算機使用過。但在硬體架構中
補碼方案是最常用的
,原因有二:
- 補碼使得建構低成本,高速度的硬體執行算術運算成為可能
- 其次,二進制補碼算法的硬體也可以處理無符号的算術。
二進制串 | 無符号位權解釋 | 原碼解釋 | 反碼解釋 | 補碼解釋 |
---|---|---|---|---|
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 |
如上圖所述,補碼的優勢如下:
- 無符号和補碼的優點在除非溢出,否則相同的硬體操作對于兩種表示都是有效的。例如,1001加1會産生1010,在無符号中,1加9等于10;在補碼中,給-7加一就産生-6。
。是以計算機可以使用單個硬體電路來提供無符号或補碼整數運算;運作在計算機上的軟體可以為每個整數選擇一個解釋
- 補碼相對反碼和原碼來說,同樣的位數下,負數可以多一種解釋。