-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)
- 正數的原碼,反碼,補碼都是相同的
- 負數原碼和反碼互相轉換
負數原碼轉反碼:符號位不變,數值位按位取反
原碼 1011 0101
反碼 1100 1010
負數反碼轉原碼:符號位不變,數值位按位取反
反碼 1100 1010
原碼 1011 0101
- 負數原碼和補碼互相轉換
負數原碼轉補碼:符號位不變,數值位按位取反,末尾加一
原碼 1011 0101
補碼 1100 1011
負數補碼轉原碼:符號位不變,數值位按位取反,末尾加一
補碼 1100 1011
原碼 1011 0101
- 負數反碼和補碼互相轉換
負數反碼轉補碼:符號位不變,末尾加一
反碼 1100 1010
補碼 1100 1011
負數補碼轉反碼:符號位不變,末尾減一
補碼 1100 1011
反碼 1100 1010