天天看點

java原碼、補碼、反碼總結

在java虛拟機中整數有byte、short、int、long四種 分别表示 8位、16位、32位、64位有符号整數。整數使用補碼表示。

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

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

+7的原碼為: 00000111

 -7的原碼為: 10000111

對于原碼來說,絕對值相等的正數和負數隻有符号位不同。

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

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

為了簡單起見,我們用1個位元組來表示一個整數:

     +7的反碼為:00000111

     -7的反碼為: 11111000

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

+7的補碼為: 00000111

-7的補碼為: 11111001

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

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

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

步驟:

1.該數的絕對值取反 

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

1.反碼+1

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

正數的絕對值取反+1

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

1.二進制原碼表示 

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

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.确定byte是1個位元組,也就是8位。

2.最大值 0111 1111

3.最小值 1000 0000。

4.0111 1111 就是127。

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

int a=232;

//0000 0000 1110 1000

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

System.out.println((byte) a);

輸出結果為-24:

原理如下圖:

java原碼、補碼、反碼總結