-128的原碼

-128的原碼結論

背景:

  • java中byte佔兩個字節八位。
  • 無符號範圍爲0 ~ 255,即二進制範圍0000 0000 ~ 1111 1111。
  • 有符號範圍爲-128 ~ 127,即二進制範圍 1111 1111 ~ 0111 1111。

問題點:有符號情況下,1111 1111 ~ 0111 1111 表示 -127 ~ 127,原碼只能表示出255位,-128沒有表示出來。

解析:

  • 已知 -128 的補碼是1000 0000,求 -128 的原碼
  • 除符號位,對補碼各位取反,得到1111 1111。
  • 除符號位,對補碼各位加一,得到 11000 0000。
  • 有溢出,取後八位得到 1000 0000。
  • 因爲0的原碼是0000 0000,那麼1000 0000可以理解成 -0
  • 將 -0 原碼規定爲 -128 (這裏是我的理解,如有更好的理解歡迎評論。我們只要記住8位有符號補碼1000 0000 是 -128即可)

結論:-128在八位有符號表示時,是沒有原碼的。

相關題目解析

short a = 128;
byte b  = (byte)a;
System.out.println("result:"+b);
result:-128
  • short 佔2個字節,16位,128用補碼錶示:0000 0000 1000 0000
  • 強轉byte(byte 佔1個字節,8位),程序截取後8位:1000 0000
  • 補碼1000 0000 對應的 是 -128

原碼、反碼、補碼基礎知識

參考文章(https://www.cnblogs.com/sakurayj/p/10253911.html)

  1. 正數的原碼,反碼,補碼都是相同的
  2. 負數原碼和反碼互相轉換
負數原碼轉反碼:符號位不變,數值位按位取反
原碼 1011 0101
反碼 1100 1010

負數反碼轉原碼:符號位不變,數值位按位取反
反碼 1100 1010
原碼 1011 0101
  1. 負數原碼和補碼互相轉換
負數原碼轉補碼:符號位不變,數值位按位取反,末尾加一
原碼 1011 0101
補碼 1100 1011

負數補碼轉原碼:符號位不變,數值位按位取反,末尾加一
補碼 1100 1011
原碼 1011 0101
  1. 負數反碼和補碼互相轉換
負數反碼轉補碼:符號位不變,末尾加一
反碼 1100 1010
補碼 1100 1011

負數補碼轉反碼:符號位不變,末尾減一
補碼 1100 1011
反碼 1100 1010
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章