什麼是原碼、反碼、補碼?
計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。
原碼:
在數值前直接加一符號位的表示法。
例如-7的原碼是1
0000111
反碼:
正數的反碼與其原碼相同;
負數的反碼是對其原碼逐位取反,但符號位除外。
例如-7的反碼是1
1111000
補碼:
正數和+0的補碼是其原碼,負數則先計算其反碼,然後反碼加上1,得到補碼
##########################分界線##################################
爲什麼要提出補碼呢?
我查閱了一些材料,得到如下總結:
最原先最簡單的是原碼,但是因爲原碼存在一個運算的問題:
十進制 | 原 碼 |
---|---|
1 | 0000 0001 |
-1 | 1000 0001 |
加法結果 | 1000 0001 |
十進制結果 | -2 |
這樣最基礎的運算如果按照計算機邏輯則會出錯,即
原碼是有符號數的最簡單的編碼方式,便於輸入輸出,但作爲代碼加減運算時較爲複雜,故計算機一般不採用這種編碼方式存儲符號數。
於是提出了反碼,但是反碼出現了另一個問題:
計算結果會出現1000 0000(-0)
這樣的存在,於是會出現二進制與十進制的互換不再是一一對應的關係這樣的問題,增加計算難度,故也被拋棄。
隨後提出了基於反碼的-0
問題而誕生的補碼,專門用來解決-0
的問題。
補碼換算爲原碼
的過程中,如果補碼是正數或者+0的補碼,則其原碼就是補碼本身;如果補碼是負數或者-0的補碼,則其原碼的計算方法是,先將補碼減掉1,得到反碼,再將反碼取反,得到原碼。