Java基礎-原碼反碼補碼spa
做者:尹正傑基礎
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。計算機
注意,咱們這裏舉列的原碼和反碼只是爲了求負數的補碼,在計算機中沒有原碼,反碼的存在,只有補碼。數字
一.原碼
1>.正數的原碼就是它的自己
假設使用一個字節存儲整數,整數10的原碼是:0000 1010
2>.負數用最高位是1表示負數
假設使用一個字節存儲整數,整數-10的原碼是:1000 1010
二.反碼
1>.正數的反碼跟原碼同樣
假設使用一個字節存儲整數,整數10的反碼是:0000 1010
2>.負數的反碼是負數的原碼按位取反(0變1,1變0),符號位不變
假設使用一個字節存儲整數,整數-10的反碼是:1111 0101
三.補碼(再次強調,整數的補碼纔是在計算機中的存儲形式。)
1>.正數的補碼和原碼同樣
假設使用一個字節存儲整數,整數10的補碼是:0000 1010(第三次強調:這一串是10這個整數在計算機中存儲形式)
2>.負數的補碼是負數的反碼加1
假設使用一個字節存儲整數,整數-10的補碼是:1111 0110(第三次強調:這一串是-10這個整數在計算機中存儲形式)
四.在計算機中,爲何不用原碼和反碼,而是用補碼呢?
由於在使用原碼,反碼在計算時不許確,使用補碼計算時才準確。
1>.使用原碼計算10-10
0000 1010 (10的原碼)
+ 1000 1010 (-10的原碼)
------------------------------------------------------------
1001 0100 (結果爲:-20,很顯然按照原碼計算答案是否認的。)
2>.使用反碼計算10-10
0000 1010 (10的反碼)
+ 1111 0101 (-10的反碼)
------------------------------------------------------------
1111 1111 (計算的結果爲反碼,咱們轉換爲原碼的結果爲:1000 0000,最終的結果爲:-0,很顯然按照反碼計算答案也是否認的。)
3>.使用補碼計算10-10
0000 1010 (10的補碼)
+ 1111 0110 (-10的補碼)
------------------------------------------------------------
1 0000 0000 (因爲咱們這裏使用了的1個字節存儲,所以只能存儲8位,最高位(第九位)那個1沒有地方存,就被丟棄了。所以,結果爲:0)
五.小試牛刀
有了上面的案例,接下來,咱們來作幾個小練習吧,分別計算如下反碼錶示的十進制數字是多少呢?
1>.0b0000 1111
相信這個數字你們異口同聲的就能說出它的答案是:15(由於正數的補碼和原碼同樣)
2>.0b1111 1111
計算過程:0b1111 1111(補碼)------>0b1111 1110(反碼)------>0b1000 0001(原碼)
將其換算成原碼以後就能夠獲得最後的結果爲:-1
3>.0b1111 0000
計算過程:0b1111 0000(補碼)------>0b1110 1111(反碼)------>0b10010000(原碼)
將其換算成原碼以後就能夠獲得最後的結果爲:-16
4>.0b1000 0001
計算過程:0b1000 0001(補碼)------>0b1000 0000(反碼)------->0b1111 1111(原碼)
將其換算成原碼以後就能夠獲得最後的結果爲:-127