【深刻淺出-JVM】(2):原碼、反碼、補碼

計算機中有補碼錶示 0

0 爲正數jvm

原碼 00000000 00000000 00000000 00000000
反碼 00000000 00000000 00000000 00000000    正數反碼等於原碼
補碼 00000000 00000000 00000000 00000000    正數補碼等於原碼

0 爲負數
原碼 10000000 00000000 00000000 00000000
反碼 11111111 11111111 11111111 11111111 負數反碼等於原碼符號位不變,其他取反
補碼 00000000 00000000 00000000 00000000 負數補碼等於反碼+1spa

用補碼
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原
用反碼
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0code

數值 原碼 反碼 補碼
+0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 1111 0000 0000

補碼、原碼、反碼轉換

負數原碼轉補碼,最高位不變,其他取反,而後 +1
10000001
11111110
11111111
負數補碼轉原碼,最高位不變,其他取反,而後+1 補碼->反碼->原碼->反碼->補碼 ,(二進制數,先-1再取反和先取反後+1,結果同樣)
11111111
10000000
10000001 rem

負數反碼轉原碼
符號位不變,其他取反
11111111
10000000get

區別:it

  1. 8位二進制, 使用原碼或反碼錶示的範圍爲[-127, +127], 而使用補碼錶示的範圍爲[-128, 127].

補碼能夠多表示一個範圍,實際上是利用補碼 10000000 的原碼是 = -128table

  1. 原碼最大的問題就是 一個數加上他的相反數不等於 0
  2. 已知補碼,求原碼的負數的補碼:符號位和數值位都取反,末位再加1

補碼

經常使用概念

  • 左移

左移的規則只記住一點:丟棄最高位(符號位),0補最低位class

  • 右移

左邊空出的位用0或者1填補。正數用0填補,負數用1填補。注:不一樣的環境填補方式可能不一樣;
低位右移溢出則捨棄該位。二進制

  • 無符號右移

左邊空出的位用0填補,低位右移溢出則捨棄該位。im


感謝您的耐心閱讀,若是您發現文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,您的鼓勵是做者寫做最大的動力。

做 者 : @mousycoder

原文出處 : http://mousycoder.com/thinkin...

相關文章
相關標籤/搜索