1. 補碼(two's complement) ,在計算機系統
中,數值一律用補碼來表示(儲存)。 主要原因:使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄。 補碼與原碼
的轉換過程幾乎是相同的。
2.一般的說法是負數的補碼為其原碼除符號位外取反然後總體加一,也就是說,要得到乙個負數數的補碼,要先知道這個負數的原碼才行。那麼,問題出現了,在8位長度下,-128的原碼與反碼都不存在,因為乙個位元組的有符號數的原碼範圍是: -127 ~ + 127 ,既然不存在 -128的原碼那麼就無法求出 -128 的補碼了,怎麼辦?
用補碼表示的時候,
-127-1=-128
也就是:
1000 0001(-127補碼) +1111 1111(-1的補碼)=1 1000 000(第九位需要捨去)也就是結果1000 0000
因為補碼中0的表示是唯一的0000 0000(原碼0000 0000 和1000 0000都對應了補碼的0000 0000),這個時候補碼中的1000 0000就多出來了,於是就用他來表示-128了。如上式,正好兩個補碼的和等於-128的結果也為1000 0000(補碼)。這樣也就是充分利用了資源。要知道,當時這些資源都是很寶貴的。
【例4】-65的補碼是10111111
若直接將10111111轉換成十進位制,發現結果並不是-65,而是191。
事實上,在計算機內,如果是乙個
二進位制數,其最左邊的位是1,則我們可以判定它為負數,並且是用補碼表示。
若要得到乙個負二進位制數的絕對值(稱為真值),只要各位(包括符號位)取反,再加1,就得到真值。
如:二進位制值:10111111(-65的補碼)
各位取反:01000000
加1:01000001(+65的補碼)
4.負數,值,原碼,符號位不變其它取反,+1
1000 0000,那麼,它的原碼是什麼呢?
從補碼求原碼的方法跟原碼求補碼是一樣的
先保留符號位其它求反: 1111 1111, 再加1:11000 0000, 超過了8位了
對,用8位數的原碼在這裡已經無法表示了
關鍵就在這裡,補碼 1000 0000 為 -128 是不用懷疑的(上面的窮舉),
那麼,回到原碼處, 它的原碼也是 1000 0000(超出的自動丟失),
1000 0000 在原碼表示什麼呢? -0, 但補碼卻規定0沒有正負之分
轉換一下思路,看看計算機裡,是怎麼運算的:
對於負數,先取絕對值,然後求反,加一
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000
現在明確了吧
所以, 8位有符號的整數取值範圍的補碼表示
1000 0000 到 0000 0000, 再到 0111 1111
即 -128 到 0, 再到 127
最終 -128 ~ +127
由 128的補碼引出的深層次思考。
一般的說法是負數的補碼為其原碼除符號位外取反然後總體加一,也就是說,要得到乙個負數數的補碼,要先知道這個負數的原碼才行。那麼,問題出現了,在8位長度下,128的原碼與反碼都不存在,因為乙個位元組的有符號數的原碼範圍是 127 127 既然不存在 128的原碼那麼就無法求出 128 的補碼了,怎麼辦?...
由 128的補碼引出的深層次思考
一般的說法是負數的補碼為其原碼除符號位外取反然後總體加一,也就是說,要得到乙個負數數的補碼,要先知道這個負數的原碼才行。那麼,問題出現了,在8位長度下,128的原碼與反碼都不存在,因為乙個位元組的有符號數的原碼範圍是 127 127 既然不存在 128的原碼那麼就無法求出 128 的補碼了,怎麼辦?...
由return引出的思考
public class test public static int get finally 返回的結果是2。try中的return 語句呼叫的函式先於finally 中呼叫的函式執行,也就是說return 語句先執行,finally 語句後執行,所以,返回的結果是2 return 並不是讓函式馬...