在開始之前首先明確3個概念:
1、正數的原碼、補碼和反碼都是一樣的。
2、計算機中是用補碼來表示數字的二進制的。
3、二進制的最高位(第一位)是符號位,0表示正數,1表示負數。
下面以一些簡單的例子來介紹原碼、反碼和補碼。採用8位二進制來進行說明即:0000 0000;
原碼
[12]原 = 0000 1100,
[-12]原 = 1000 1100,負數的原碼就是正數的原碼改變符號位。
反碼
反碼是原碼符號位不變,其餘數值位按位取反。
[-12]反 = 1111 0011。
補碼
補碼是在反碼最低位加1。(實際上補碼和反碼在定義上並沒有直接的關係,只是恰好補碼等於反碼最低位加1)。
[-12]補 = 1111 0100。
轉換
反碼轉原碼(符號位不變,數值位取反)
[X]反 = 1111 0011 -> [X]原 = 1000 1100
補碼轉原碼
[X]補 = 1111 0010,根據原碼轉補碼倒推,我們應該先補碼-1得到[X]反=1111 0001,然後對反碼取反得到[X]原=1000 1110=-14。但是如果減1在取反的話,存在借位的情況,這樣算起來有時候容易出錯。所以還要另外一種算法:先對補碼的數值位取反,然後加1即可得到原碼。(即補碼的補碼是原碼)
[X]補 = 1111 0100 -> 1000 1011 -> 1000 1100。
補碼求相反數的補碼
已知[X]補=0000 1100,求[-X]補。
按照老老實實的方法來算[X]原=[X]補=0000 1100,則[-X]原=1000 1100,[-X]補=1111 0100。當X爲負數時,我們要先求其原碼,在得到起絕對值的原碼,正數補碼原碼一直,不用在計算。
有一種簡單的算法是對[X]補的符號位和數值位都取反再加1,即:
[X]補 = 0000 1100 -> 1111 0011 -> 1111 0100。
關於我上面說的補碼和反碼無直接關係的原因可以參考原碼,反碼,補碼的深入理解與原理和原碼、反碼、補碼知識詳細講解