1. 程式人生 > >java原碼、補碼、反碼總結

java原碼、補碼、反碼總結

1.1. java虛擬機器整數

java虛擬機器中整數有byteshortintlong四種 分別表示 8位、16位、32位、64位有符號整數。整數使用補碼錶示。

所以我們先了解一下原碼和反碼。

1.1.1. 原碼

所謂原碼就是符號位加上數字的二進位制表示,int為例,第一位表示符號 (0正數 1負數)簡單期間一個位元組表示

+7的原碼為: 00000111
 -7的原碼為: 10000111

對於原碼來說,絕對值相等的正數和負數只有符號位不同。

1.1.2. 反碼

一個數如果為正,則它的反碼與原碼相同;一個數如果為負,則符號位為1,(符號位不變化,其餘位數取反)。

換言之 該數的絕對值取反(絕對值取反各位都取反

)
為了簡單起見,我們用1個位元組來表示一個整數:
     +7的反碼為:00000111
     -7的反碼為: 11111000

1.1.3. 補碼

補碼:一個數如果為正,則它的原碼、反碼、補碼相同;一個數如果為負,去到反碼然後加1。(反碼加1就是補碼)為了簡單起見,我們用1個位元組來表示一個整數:
+7的補碼為: 00000111
-7的補碼為: 11111001

1.1.4. 總結

正數:它的原碼、反碼、補碼相同。

負數:反碼符號位不變化,其餘位數取反,補碼符號位不變化其餘各位原碼取反(反碼)+1換言之 反碼+1

已知一個負數原碼求反碼:

步驟:

1.該數的絕對值取反

已知一個負數反碼去求補碼:

1.反碼+1

已知一個負數求反碼步驟:

正數的絕對值取反+1

已知一個負數求補碼步驟:

1.二進位制原碼錶示 

2.符號位不變化為求反碼。

3.符號位不變化,其餘的加1.

例項如下:

-10求補碼步驟:

-10的原碼: 10000000 00000000 00000000 00001010

-10的反碼: 11111111 11111111 11111111  11110101

-10的補碼:11111111 11111111 11111111 11110110

已知一個負數的補碼,將其轉換為十進位制數,步驟

   1、先對各位取反;
      2、將其轉換為十進位制數;
      3、加上負號,再減去1。

  例如:

11111010,最高位為1,所以是負數,先對各位取反得00000101,轉換為十進位制數得5,加上負號得-5,再減1得-6。

1.1.5. Java byte 型別的取值範圍

1.確定byte1個位元組,也就是8

2.最大值 0111 1111

3.最小值 1000 0000

4.0111 1111 就是127

5.1000 0000 減去1是 1111 1111 按照位取反 1000 0000 得到-128

1.1.6. 常見問題

int a=232;

//0000 0000 1110 1000

System.out.println(Integer.toBinaryString(a));

System.out.println((bytea);

輸出結果為-24

原理如下圖: