天天看點

關于二進制的負數怎麼表示與移位運算

    對于正數的二進制,應該沒有疑問,比如(以8位系統來分析,第一位為符号位)1的二進制表示為00000001。

    而對于負數來說,就比較麻煩,比如-1。有人說是10000001,而有人說是11111111。

    其實這兩種說法都沒錯,這是分類方法的差異。在一些把二進制分為原碼、反碼、補碼的體系中(注:當然對于正數,三碼為1),10000001是-1的原碼,而11111111是-1的補碼。

    因為在計算機内,-1是以11111111(也就是上文的補碼)的形式存儲在計算機,同時計算機也是以補碼的方式進行運算,是以有些人就不過原碼反碼補碼這種亂七八糟的東西,直接認為-1就是1111111。

    題外話,為什麼計算機存儲負數的方式是采用補碼,而不是采用原碼(原碼更有邏輯性)?還是以-1為例(如果要推導全部,請百度,由于比較複雜,這裡就不推論了,,,因為我也不會。。)

    因為為了滿足1-1=1+(-1)這個關系。

    如果采用原碼,則1-1  != 1+(-1)= 00000001+10000001= 10000010=-2(原碼表示)。

    而采用補碼 ,則1-1 = 1+(-1) = 00000001+11111111 = 0(因為第8位溢出,相當于被丢棄),完美解決問題,别的負數也是符合這種機制,故為了運算友善,就舍棄了邏輯性。

    下面就來說一種我認為比較好的一種求負數的二進制(這裡說的是補碼)的方法。

    求一個負數的補碼,我們隻要用該負數的絕對值,取反加1就可以得到相應的負數。還是以-1為例,其絕對值是1,也就是二進制的00000001,取反加1得11111111,也就是-1的補碼形式。

    而怎樣從一個二進制數(補碼)推出它的十進制數呢,(對于有符号數而言)首先看二進制的最高位,如果是0,則該二進制就是正數,這個很友善轉換。若是1,則說明該二進制數是負數,但是補碼的非邏輯性則使人很難看出這個數到底是多少,我們可以對這個數取反加一,那我們就可以得到這個數的二進制的絕對值,再由符号位就可以知道這個數的值了。

    以11111111(補碼)為例,最高位為1,我們知道它是負數,取反加1後,我們得到00000001,則知道其的絕對值是1,那麼我們可以知道這個數就是-1。

繼續閱讀