補碼到底是個什麼東西

2021-09-29 06:23:03 字數 1926 閱讀 8439

先引入乙個前提,在計算機中數字是以二進位制進行儲存的,也就是我們看到的2,在計算機中儲存的是10。我們進行的加法運算2+1=3在計算機中是這樣的(這裡先假設計算機儲存的是4位二進位制數字)0010+0001=0011

很容以看的出來,4為二進位制數能表示的最大數字是1111,就像兩位十進位制數表示的最大數字是99一樣。那如果在進行加法運算時,結果超出儲存的容量怎麼辦?比如:9+9=18二進位制表示為:1001+1001=10010,但是,因為只能儲存4位數的原因,最高位丟了,結果變成了0010,也就是2,這時是發生了溢位的。在做運算時要避免數值發生溢位(當然,現在計算機儲存的數字為64位,日常使用完全不用擔心)

運算不光有加法,還有減乘除。乘法就是多次加法,除法就是多次減法。那麼減法如何實現呢?在剛開始的時候,計算機只能進行加法運算,這時一部分人想辦法讓其能夠直接進行減法計算,而另一部分人想通過加法來實現減法,最終後者先給出了解決方案。(只是我臆想的情景)

還記得上面提到的,四位二進位制數表示的最大數字為15,當發生溢位時:

16=>二進位制:10000 => 0

17=>二進位制:10001 => 1

顯然,去掉最高位等於減去16

那麼能不能利用加法溢位來實現減法呢?下面簡單推倒一下:

9-2=7若要實現9+x=7那麼利用溢位的原理,就要實現9+x=7+16=23簡單的解一下方程x=23-9=14, 很好,來驗證一下:

9+14的二進位制表示為:1001+1110=10111最高位溢位,結果為:0111也就是7,完美。

下面問題來了:如何將上邊的2轉成14呢?也就是講二進位制的0010轉成1110。他們有什麼關係呢?

偉大的數學科學家前輩們總結出了規律。並發明了反碼和補碼的概念。補碼就是上面轉換後的14。

原碼=>按位取反=>反碼

反碼=>加1=>補碼

雖然不知道這個規律是如何找出來的,但經過無數次驗證,確實是這樣。

當引入了負數的概念時,為了表示正負,規定第一位為符號位(0為正,1為負),因為引入符號位,原來的4位數,能表示的最大值也變成了0111

因為負數的引入,現在所有的減法都可以當做加法來實現了,9-2=9+(-2),或者說9+(-2)=9-2。計算仍然是通過補碼來實現。

負數的補碼為:符號位不變按位取反,再加1

正數的補碼為:它本身

負數的補碼很好理解,就是上面總結的規律,利用加法來實現減法。正數的補碼為啥是它本身呢?你看剛才分析的減法,只有被減數進行了轉換,減數沒變吧。很好理解。其實也是為了可以統一進行處理,引入補碼後,正負數可以使用一套加減法規則進行計算。

簡單實驗一下:

2+(-4)=-2

-4 => 二進位制表示:1100 => 補碼:1100

2 => 二進位制表示:0010 => 補碼:0010

1100+0010=1110(補碼)

將計算結果再轉成原碼 1010,-2沒毛病

然後,有乙個尷尬的問題,正數的0為:0000,負數的0為:1000,同乙個數字,但是換成補碼後,你會發現是同乙個數字:0000

總結一下:利用補碼計算,就是通過加法來實現減法運算,是利用了計算機儲存位數有限,超出發生溢位並丟失最高位的特性。

不知道補碼是哪位偉大的科學家發明的,前人栽樹後人乘涼,膜拜。

Lucene到底是個什麼東西

lucene是個開源的搜尋引擎,如果你的專案的一些資訊需要被搜尋,但又沒有合適的搜尋工具,那麼你應該考慮使用它.為什麼我會使用這個玩意?mysql 全文索引對中文支援很差 也許是我對 mysql沒有很深入的研究導致的 大家可以關注海量科技對 mysql的中文搜尋支援,他們的玩意我沒試過,不方便說三道...

HttpModule到底是個什麼東西

在學習dnn到urlrewritemodule類時 urlrewritemodule.vb中 發現這個類是由ihttpmodule介面繼承來的。一查msdn知道了urlrewritemodule原來是個httpmodule。那麼httpmodule到底是個什麼東西?有什麼用?用了有什麼好處?http...

架構 到底是個什麼東西 轉

舉個例子吧。你要在螢幕上列印 hello wrold.ok 你寫下 prtinf hello world.然後,你有希望能夠寫道檔案中。於是改為 if 螢幕 else 檔案 再然後,你有希望能夠寫到印表機。if 螢幕 else 檔案 else 印表機 於是你感覺有點煩 想辦法 如何不改動程式或少改動...