用補碼取反加一求原碼的陷阱

問題引入

一個8位補碼:1000 0000 請求它的原碼?

如果按照以往的取反加一經驗:取反得到 1111 1111B ,再加1得到 0000 0000B ?結果是0?
這明顯不對,因爲我們知道不管是正0還是負0,其補碼都應該是 0000 0000B而不是題中的1000 0000B。

探究:

讓我們來思考一個問題:一個8位有符號二進制數,除掉符號位其表示範圍爲 0~128,如果加上符號位,照理說應該乘2,也就是256個碼字可以用來表示,但是我們知道8位有符號數的表示範圍是-127-127,也就是說一共255個數,可以發現少了一個數,這是因爲負數0沒有意義。我們可以猜想到:原碼有255個,如果通過取反加一得到的補碼也就會少一個,而這個數就是1000 0000,其無法通過取反加一得到(因爲如果只有0無法借位)。所以爲什麼會有補碼的存在,就是用來彌補原碼負0的不足。

結論歸納:

原碼求補碼:正數不變,對於負數我們仍然可以取反加一
補碼求原碼:對於1開頭後全0的數,其真值就是負0浪費的值,也就是-128(0到127,所以-1應該到128),這個補碼是沒法通過取反加一求原碼的,因爲其沒有原碼。但對於其他補碼我們仍然可以取反加1求原碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章