計算機中保存的數據都是按照補碼來保存,涉及到的概念,原碼反碼補碼具體是什么,通過下面幾個例子來說明下。
正數
正數的原碼,反碼和補碼是一樣的。正數的原碼,其最高位代表符號位,1代表負數,0代表正數,具體看例子。
int 20的原碼?可以很快的得到如下結果,32個bit,高位補齊為0即可。
原碼:00000000 00000000 00000000 0001 0100
根據規則,其反碼和補碼如下。
反碼:00000000 00000000 00000000 0001 0100
補碼:00000000 00000000 00000000 0001 0100
負數
負數的原碼,最高位為1,反碼是固定最高位的情況下,其他低位1變0,0變1,補碼是反碼的基礎上加1,具體看例子。
int -20的原碼?可以很快的得到如下結果,32個bit,除了最高位為1,其他高位補齊為0即可。
原碼:10000000 00000000 00000000 0001 0100
反碼:11111111 11111111 11111111 11101011
補碼:11111111 11111111 11111111 11101100
0
考慮到高位為0時,其他位全部為0可以表示為+0,高位為1時,其他位全部為0有可以表示為-0,這樣就有兩個0,在計算機中-0代表當前數據類型的最小值。
1 public class operatorDemo{ 2 3 public static void main(String[] args){ 4 //測試自增自減類型轉換 5 byte b=127; 6 //b+=1;//這樣寫沒問題 7 //b=b+1;//這樣寫編譯不通過 8 b++;//這樣寫沒問題 9 System.out.println(b); 10 } 11 12 }
輸出結果為-128,因為byte 127補碼為0111 1111,執行自增運算首先變成了int類型即00000000 00000000 00000000 0111 1111,然后加1變成00000000 00000000 00000000 1000 0000,最后向下轉型舍棄高位為byte變成1000 0000,這就是-0,發現通過這個補碼無法推測反碼再原碼,這樣就人為規定為-128了,計算機處理這個補碼時按照-128來處理。如果byte類型補碼是1111 1111時,應該是多少呢?這個高位為1一看就是負數,可以輕松推出反碼為1111 1110,再推出原碼為1000 0001,這個原碼則代表的就是-1,可以看出來補碼1111 1111~1000 0000代表范圍為-1~-128的負數。
參考博文:
(1)https://www.jianshu.com/p/47761557bab0