數在機器中的表示有以下幾種:原碼、反碼、補碼。
原碼、反碼、補碼的基本概念
字節:8個位。
字長:若干個字節。到底是幾個字節?具體看是哪種CPU。比如2010普及組第11題就假設一個字長只有一個字節8個位。
原碼、反碼、補碼都是建立在機器數在一個字長上的表示。為了方便理解,我們假設字長為一個字節。要注意事實上為32位CPU字長為4個字節,64位CPU字長為8個字節。
原碼:首位為符號位,其余為真值。比如:

特點:簡單。
范圍:比如字長為8位,則范圍為 11111111(-255)至 01111111(+255)。
缺點:0有兩個表示,分別為正零(00000000)和負零(10000000),給計算機計算帶來不便。
反碼:首位為符號位,其它位分正數和負數兩種情況。
反碼正數:所有位和原碼一樣;
反碼負數:除了符號位和原碼一樣,其他位相反。
比如:77的反碼表示為01001101;-77的反碼表示為10110010。
補碼:分正數和負數兩種情況。
補碼正數:所有位和反碼一樣,當然也和原碼一樣。
補碼負數:等於反碼加1。簡單的一句話,其實很麻煩。
比如:77的補碼表示為01001101(和原碼、反碼一致);-77的補碼表示為10110011。
加1之后會有進位,因為補碼沒有符號位,所以負零的補碼表示也是00000000。
特點:表示比補碼更麻煩。但是解決了一個問題:0只有一種表示。
| 原碼 |
反碼 |
補碼 |
|
| 正零 |
00000000 |
00000000 |
00000000 |
| 負零 |
10000000 |
11111111 |
00000000 |
補碼加法:在計算機中,凡是帶符號數一律用補碼表示,運算結果自然也是補碼。其運算特點是:符號位和數值位一起參加運算,並且自動獲得結果(包括符號位與數值位)。
補碼加法的運算規則為:

即:兩數補碼的和等於兩數和的補碼。
【例】已知 [+51]補=0011 0011,[+66]補=0100 0010,[-51]補=1100 1101;
求:[+66]補+[+51]補=?,[+66]補+[-51]補=?
【解】:
(1)由於 [+51]補=0011 0011,[+66]補=0100 0010,

故 [+66]補+[+51]補=[(+66)+(+55)]補=01110101
結果為正,因此
[(+66)+(+55)]原=[(+66)+(+55)]補=01110101
其真值為+117,計算結果正確。
(2)由於 [+66]補=0100 0010,[-51]補=1100 1101,

每日練習
1、無符號二進制數11001000所表示的十進制數為___________ 。
A .104 B. 148 C. 172 D . 200
2、有符號二進制數11001000所表示的十進制數為___________ 。
A . -200 B. -72 C. 72 D . 200
3、用16位和8位機器碼分別寫出十進制數+58和—58的原碼、反碼和補碼。
4、若用8位機器碼表示十進制數—101,則原碼表示的形式為 (1) ;
補碼表示的形式為(2) 。
(1)A.11100101 B.10011011 C.11010101 D.11100111
(2)A.11100101 B.10011011 C.11010101 D.11100111
5、已知一個字長為8的整數的原碼是10011010,求它的補碼。
6、已知一個字長為8的整數的補碼是10011000,求它的原碼。
歷年真題
1、在字長為16位的系統環境下,一個16位帶符號整數的二進制補碼為1111111111101101。其對應的十進制整數應該是( )。
A.19 B.-19 C.18 D.-18
2、一個字長為8位的整數的補碼是11111001,則它的原碼是( )。
A.00000111 B.01111001 C.11111001 D.10000111
3、在整數的補碼表示法中,以下說法正確的是( )。
A.只有負整數的編碼最高位為1
B.在編碼的位數確定后,所能表示的最小整數和最大整數的絕對值相同
C.整數0只有一個唯一的編碼
D.兩個用補碼表示的數相加時,如果在最高位產生進位,則表示運算溢出
