原码:
最左边为符号位,其余为数值
对于一个字节(byte),共8位(bit),最大可以取得0 1 1 1 1 1 1 1 的数值,十进制为+127,
最小值为1 1 1 1 1 1 1 1 ,十进制为-127
使用原码进行负数计算时,实际运算的结果与预期结果相反,(对于10000000加一为10000001,表示-1.,但是十进制为0+1=1,为正一,所以结果冲突)
则引出反码
反码:
为了解决原码不能计算负数的问题而出现的
正数反码不变,负数在原来符号位不变的基础上,后面的数值位取反
-56原码 1 0 1 1 1 0 0 0,其反码 1 1 0 0 0 1 1 1 ,二进制加一 ;1 1 0 0 1 0 0 0
-56+1 = -55 ,二进制同上
在反码中0有两种状态+0 和-0 ,分别二进制0000 0000,和1111 1111 ,若反码的负数运算跨0,则会引起错误
则引出补码
补码
正数的原码反码补码都一样,为了避免0的重复歧义 ,则负数表示反码再加一,
+0和-0都是0000 0000
-1 为 1111 1111
-2 为1111 1110
...
比如-4 的补码 1111 1100 加5 ,
1111 1100 (-4的补码)
+ 0000 0101 (+5的原码/反码/补码)
-------------------
0000 0001 (+1的原/反/补)
引入补码后,则引出-128,其没有原码也没有反码,只有规定的补码
十进制 | 原码 | 反码 | 补码 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | 无 | 无 | 1000 0000 |
最后注意
计算机中的存储和计算都是以补码的形式进行的
java中byte 占1字节 8bit
short 占2字节 16bit
int 占4字节 32bit
long 占8字节