計算機中原碼、反碼、補碼的理解
計算機內部所有的資料都是以二進位制的形式儲存,二進位制又有多種編碼:原碼、反碼、補碼等。而在計算機中無符號數(unsigned numbers)使用原碼錶示,有符號數(signed numbers)使用補碼錶示。
首先在計算機中二進位制中最高位是存放符號位的,正數為0,負數為1
以1個位元組表示,1位元組等於8位
例如:
+1 = 0000 0001
-1 = 1000 0001
原碼
原碼就是第一位表示符號位,其餘表示值,例如一個8位二進位制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
因為第一位表示符號位,因此取值範圍:[-127 , 127]
反碼
反碼的表示方法:正數的反碼是其本身,負數的反碼就是在原碼的基礎上,符號位不變,其餘各位取反。
[+1] = [0000 0001]原 = [0000 0001]反
[- 1] = [1000 0001]原 = [1111 1110]反
補碼
補碼的表示方法:正數的補碼是其本省,負數的補碼在其反碼符號位不變的基礎上 加 1
[+1] = [0000 0001]原 = [0000 0001]補
[- 1] = [0000 0001]原 = [1111 1111]補
由補碼來理解byte的的最大值與最小值
在java中byte 最大值:127 最小值:-128
byte的二進位制中最大為0111 1111 最小值1000 0000 ,注意最高位為負號位
正數的原碼就是0111 1111,補碼也是0111 1111 因此最大值127
負數的原碼是1000 0000,其補碼除了符號位,其它值都取反,在+1;因此取反後為1111 1111,在+1,把負號位拿出,此時為1 1000 0000,而1000 0000的十進位制是128,由於其符號位為負數因此為-128
參考文章: