1. 程式人生 > >為什麼要使用原碼、反碼、補碼和移碼

為什麼要使用原碼、反碼、補碼和移碼

          上篇部落格簡單的介紹了計算機中原碼、反碼、補碼和移碼的表示方式(http://blog.csdn.net/xdd19910505/article/details/40424533),對於計算機為什麼要這樣還不是很明白,就好像知道這樣一個東西,卻不知道為什麼要這樣。就好像一個人你不瞭解他不是他的朋友,他的有些事情你就不知道他是為了什麼……

          其實從原碼到補碼是一個層層遞進的關係,也是一個在錯誤中逐步發展的過程。也就是說利用原碼運算減法時出現的錯誤,為了解決出現了反碼運算,但是反碼運算時又出現了讓人不滿意的地方,於是為了更好的追求出現了補碼。


模、補數的出現

        初中還是高中或者是小學讓我們知道了這樣一件事情:

         把某物體左旋轉 90 度,和右旋轉 270度,在不考慮圈數的條件下,最終的位置是相同的;

270+90=360;

          把分針倒撥 20 分鐘,和正撥 40分鐘,在不考慮時針的條件下,效果也是相同的;

20+40=60;

          把數字 87,減去 25,和加上75,在不考慮百位數的條件下,效果也是相同的;

25+75=100;

   ……。

          總之都是會有一定的前提不考慮,可見它們的關係就是互補。而計算得到的360、60、100就是分別在不同情況下的模。知道模,就可以求一個數的補數。

           用補數代替原數,就可以用加法代替減法,出現一個進位就是一個模的值。

二進位制的模:

           有多少位參加運算,模就是1的後面加上多少個0。

例如:2位二進位制數參加運算,模就是100;即2^2=4

             8位二進位制數參加運算,模就是100000000;即2^8=256

二進位制的補碼:

求二進位制數的補數,目的是往計算機裡面存放。一般情況下,都是以 8 位二進位制數來討論補碼。

計算時加上正數,是不需要進行求取補碼的;只有進行減法(或者加上負數),才需要對減數求補碼。補碼就是按照 這個要求來定義的:正數不變,負數即用模減去絕對值。

例如:X = -126,其補碼為 1000 0010,計算方法如下:

1 0000 0000

— 0111 1110

—————————————

1000 0010

        其實就是為了儲存資料,為了計算簡單。既然補碼就可以做到這些了,那為什麼書上還有把原碼和反碼寫出來呢蠱惑人心呢?個人認為它們是沒有太多用處的,在計算機裡是不存在的,就是為了可以形象的說明二進位制是怎麼求出補碼的,只起到一箇中間計算過程的作用,要不一下子寫出一個數的補碼也是要轉幾個彎的。

        其實在剛進TGB的時候老師就講過這些東西,只是那時候並沒有聽老師的話自己下來畫一遍,寫一遍,以至於在軟考的階段對於它只有聽過卻沒有印象。那天米老師講演算法說他會自己實實在在的寫一遍計算的過程,作為我們,遇到這種事,還有什麼資格懶呢?其實,當你看似簡單的計算也許不懈寫一遍過程,但是沒有簡單的這一步,在難的地方也許就不會寫了,所以向老師學習吧!我們該學的還有太多……