由 128的補碼引出的思考

2021-06-08 20:01:39 字數 1492 閱讀 2424

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 並不是讓函式馬...