java原碼、補碼、反碼總結
1.1. java虛擬機器整數
在java虛擬機器中整數有byte、short、int、long四種 分別表示 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.符號位不變化為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.1.5. Java byte 型別的取值範圍
1.確定byte是1個位元組,也就是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((byte) a);
輸出結果為-24:
原理如下圖: