-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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章