-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