一個數在計算機中是以二進制數表示形式存在的, 這個二進制數稱爲機器數,其值稱爲真值。
符號數和無符號數是針對符號出現的兩種機器數表示方法。同一個二進制數,作爲符號數和無符號數其真值是不同的(這裏只關
注有符號數)。符號數如: char, short ,int, long等類型的變量。
定點數和浮點數是針對小數點出現的兩種機器數表示方法。浮點數如:double,float
在計算機內,有符號數有3種表示法:原碼、反碼和補碼。只有符號數纔有原碼, 反碼, 補碼
(1)原碼
A:所謂原碼就是二進制數的有符號表示法,即最高位爲符號位,
“0”表示正,“1”表示負,其餘位表示數值的大小。 以byte類型的8字節二進制舉例
舉例: 符號位 數值位
+7 0 0000111
-7 1 0000111
B:原碼不能直接參加運算,可能會出錯。例如數學上,1+(-1)=0,而在二進制中原碼
00000001+10000001=10000010,換算成十進制爲-2。顯然出錯了。
(2)反碼
A:正數 與原碼相同
B:負數 符號位不變,數值位按位取反,0變1,1變0。
舉例: 符號位 數值位
+7 0 0000111
-7 1 1111000
(3)補碼
在計算機中,數值一律用補碼來表示(存儲)。
主要原因:使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼錶示的數相加時,如
果最高位(符號位)有進位,則進位被捨棄。
A:正數 與原碼相同
B:負數 反碼加1。
舉例: 符號位 數值位
+7 0 0000111
-7 1 1111001
聯繫到byte類型的數據表數範圍是[-128, 127],而不是最大值11111111=127,最小值01111111=-127,那麼-128是怎麼表示的呢
-128沒有原碼反碼,其實是[00000000]表示正0,而0是無符號的,負0即10000000實際上就是表示的-128,它的得來方式:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補
-1-127的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補 就是-128. 但是注意因爲實際上是使用以前的-0的補碼來表
示-128, 所以-128並沒有原碼和反碼錶示.(對-128的補碼錶示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)。
使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數. 這就是爲什麼8字節二進制, 使用原碼或
反碼錶示的範圍爲[-127, +127], 而使用補碼錶示的範圍爲[-128, 127]。
對於正數,原碼補碼反碼都是一致的。負數的比較麻煩一些
Integer,Long等這些包裝類中,提供了
* Integer.toBinaryString(i)方法:
* 返回將該值轉換爲二進制補碼形式的無前導 0的 ASCII 數字字符串,
* 例 7 ---> 111 ,-7 ---> 11...1001(中間28個1)