源碼、反碼、補碼
引入原碼、反碼和補碼的目的是爲了解決減法問題。因爲計算機CPU的運算器中只有加法器,要把減法轉化成加法來計算。
計算機中沒有減法器的原因
在做減法運算時,如果兩個數十用原碼錶示的,則首先需要比較兩個數絕對值的大小,然後以絕對值大的一個作爲被減數、絕對值小的一個作爲減數,求出差值,並以絕對值大的一個數的符號作爲差值的符號。不難看出,這個操作過程比較麻煩,而且需要使用數值比較電路和減法運算電路。如果能用兩數的補碼相加代替上述的減法運算,那麼計算過程中無需使用數值比較電路和減法運算電路了,從而使運算器的電路結構大爲簡化。
原碼:將一個整數,轉換成二進制,就是其原碼。
反碼:正數的反碼就是其原碼;負數的反碼是將原碼中除符號位以外,每一位取反。
補碼:正數的補碼就是其原碼;負數的補碼是反碼+1;如單字節5的補碼爲:0000 0101;-5的原碼爲1111 1011。
1.二進制數中,兩數的補碼之和等於兩數和的補碼。
2.補碼=反碼+1
3.反碼=原碼除符號位外其他數值取反(即該數的絕對值取反),即“0”變“1”,“1”變“0”。
4.任何正數的原碼、反碼、補碼的形式完全相同。
5.在計算機中,有符號的數都是採用補碼來表示的。
6.計算的時候,符號位也參與運算。
例子:使用補碼計算“-16+11”的運算:
1 1 1 1 0 0 0 0 + -16的補碼
0 0 0 0 1 0 1 1 11的補碼
__________________
1 1 1 1 1 0 1 1 -5的補碼
如果是“-16-11”,那麼久轉化爲加法運算“-16+(-11)”
1 1 1 1 0 0 0 0 + -16的補碼
1 1 1 1 0 1 0 1 -11的補碼
———————————
1 1 1 1 0 0 1 0 1 -27的補碼