爲什麼補碼是按位取反再加一

今天刷LeetCode的位運算專題,想到機器做減法是加其補碼來計算的。我們都知道求補碼的方法是“按位取反再加一”,但是爲什麼呢?看了幾篇文章,最經典的總結就一句話,正數原碼+其負數的補碼(以下簡稱補碼)=0,正數+其負數的反碼(以下簡稱反碼)+1=0,即補碼=反碼+1。

在機器碼中最高位爲符號位。以btye類型爲例,最高位爲符號位,其餘七位數值位。當11111111(-127)加1得到的是00000000,也就是0,因爲最高位進位丟失了。

我們求補碼的目標是正數原碼+補碼=0,又因爲11111111+1=0,所以正數+補碼=11111111+1,又因爲正數+其負數的反碼(以下簡稱反碼)結果全爲1,也就是正數+補碼=正數+反碼+1,消去正數得到結果是補碼=反碼+1,因此求補碼方法是“按位取反再加一”。

 

另:

正數的反碼和補碼就是其原碼。

負數的反碼:保留符號位,數值位按位取反。補碼:反碼+1或正數按位取反+1。

所以可以說計算機中數據都是按其補碼來進行存儲和計算的。

 

另:由於0的特殊,按定義,00000000爲+0,10000000爲-0。-0並沒有什麼意義,且10000000+1=10000001=-127的補碼,因此1000000爲-128的補碼。所以byte的取值範圍爲[-128~127]

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