1. 程式人生 > >計算機中原碼、反碼、補碼的理解

計算機中原碼、反碼、補碼的理解

計算機內部所有的資料都是以二進位制的形式儲存,二進位制又有多種編碼:原碼、反碼、補碼等。而在計算機中無符號數(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

參考文章: