再度理解原碼、反碼、補碼

很早就開始接觸這些熟悉又陌生的關鍵字,但是,時不時還會有錯:

看定義:

正數的原碼、反碼、補碼形式一致,負數的反碼爲原碼的數值位取反,補碼爲反碼+1也即是原碼的數值位取反再+1,計算機中以補碼錶示數據和運算

舉例:

+34原碼=反碼=補碼:00100010
-34原碼=10100010,反碼=11011101,補碼=11011110

直接來看一個題,代碼:

int main(){
   int i=-2147483648;
   return printf("%d,%d,%d,%d",~i,-i,1-i,-1-i);
}
首先,-2147483648這個數爲32位int所能表示的最小負整數,而如果原碼爲 1000 0000  0000  0000  0000  0000  0000  0000(表示-0) ,其反碼應爲數值位取反,符號位不變,即1111  1111  1111  1111  1111  1111  1111  1111,補碼爲反碼+1 即爲0 000 0000  0000  0000  0000  0000  0000 0000(最高位溢出,捨去),而+0 的原碼、反碼、補碼均爲 0 000 0000  0000  0000  0000  0000  0000  0000,如果用 1000 0000  0000  0000  0000  0000  0000  0000作爲 -2147483648的原碼,則會導致 -2147483648和0的補碼錶示一樣。

因此,計算機中規定用 1000 0000  0000  0000  0000  0000  0000  0000來作爲 -2147483648的補碼,以確保-2147483648~2147483647都有唯一的補碼錶示;

所以:

1》~i:i的補碼爲1000 0000  0000  0000  0000  0000  0000  0000,取反0111 1111 1111 1111 1111 1111 1111 1111,此爲補碼,符號位爲0,表示正數,正數原碼補碼一致,因而該數即表示231-1,即2147483647。

2》-i:要對一個數值執行單目運算符 -  表示的是對該數取反然後再+1,也即是我們常說的求補運算,注意這裏取反+1與原碼求補碼的區別!也就是求補運算與求補碼是不一樣的!題目中i的補碼爲 1000 0000  0000  0000  0000  0000  0000  0000,取反+1,仍爲 1000 0000  0000  0000  0000  0000  0000  0000,即    -2147483648

3》1-i  我們已經求出-i的補碼爲1000 0000  0000  0000  0000  0000  0000  0000 加上1的補碼即爲 1000 0000  0000  0000  0000  0000  0000  0001
該補碼錶示的原碼爲1 111 1111  1111 1111 1111 1111 1111 1111,即爲- 2147483647。

4》-1-i  -1的補碼爲1 111 1111  1111 1111 1111 1111 1111 1111,加上-i補碼 1000 0000  0000  0000  0000  0000  0000  0000,
得 0111 1111  1111 1111 1111 1111 1111 1111,即 2147483647

弄懂以上內容,基本就差不多了!

賜教!

發佈了109 篇原創文章 · 獲贊 424 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章