Java基礎-原碼反碼補碼


                    Java基礎-原碼反碼補碼

                                  作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

  注意,我們這里舉列的原碼和反碼只是為了求負數的補碼,在計算機中沒有原碼,反碼的存在,只有補碼。

 

一.原碼

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM