1. 程式人生 > >原始碼 ,反嗎,補碼

原始碼 ,反嗎,補碼

 數值在計算機中是以補碼的方式儲存的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。

  對於一個數, 計算機要使用一定的編碼方式進行儲存。 原碼, 反碼, 補碼是計算機儲存一個具體數字的編碼方式。

  一個數在計算機中的二進位制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。比如,十進位制中的數 +2 ,計算機字長為8位,轉換成二進位制就是[00000010]。如果是 -2 ,就是 [10000010] 。因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進位制等於130)。所以將帶符號位的機器數對應的真正數值稱為機器數的真值。

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值。
反碼的表示方法是:正數的反碼是其本身;負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反。
補碼的表示方法是:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1。 (即在反碼的基礎上+1)
舉例:

十進位制數                  原碼                                 反碼                                   補碼
85                            0101 0101                       0101 0101                          0101 0101
-85                           1101 0101                       1010 1010                          1010 1011
9                              0000 1001                      0000 1001                           0000 1001
-9                            1000 1001                       1111 0110                            1111 0111
那麼計算機為什麼要使用補碼呢?
  首先,根據運演算法則減去一個正數等於加上一個負數, 即: 1-1 = 1+(-1), 所以計算機被設計成只有加法而沒有減法, 而讓計算機辨別”符號位”會讓計算機的基礎電路設計變得十分複雜,於是就讓符號位也參與運算,從而產生了反碼。 
  用反碼計算, 出現了”0”這個特殊的數值, 0帶符號是沒有任何意義的。 而且會有[0000 0000]和[1000 0000]兩個編碼表示0。於是設計了補碼, 負數的補碼就是反碼+1,正數的補碼就是正數本身,從而解決了0的符號以及兩個編碼的問題: 用[0000 0000]表示0,用[1000 0000]表示-128。 
   注意-128實際上是使用以前的-0的補碼來表示的, 所以-128並沒有原碼和反碼。使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數。 這就是為什麼8位二進位制, 使用補碼錶示的範圍為[-128, 127]。

感謝原創作者:
--------------------- 
作者:Jason_M_Ho 
來源:CSDN 
原文:https://blog.csdn.net/Jason_M_Ho/article/details/78700434 
版權宣告:本文為博主原創文章,轉載請附上博文連結!