因为计算机只有加法没有减法,在做减法运算的时候,可以认为是加上一个负数。
原码
符号位:0正1负。转化为二进制数。
1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2 (符号位也参与运算)与实际不符
反码
正数时,反码=原码;
负数时,将原码各位取反,符号位不变。
1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0(但是无正负0之说)
补码
正数时,补码=原码;
负数时,将反码加上二进制的1即可,也就是反码在最后一位上加上1就是补码了。
1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]补+[11111111]补=[00000000]补=[00000000]原
关于 -128 的补码问题(byte)
在八位二进制(byte)下,因为有一位是符号位,原码和反码只能表示0到127,-0到-127,所以-128不能用原码或反码表示。
按这种说法,128因为无法用八位二进制下的原码表示,则-128的八位二进制下的补码也是不存在的。
但是,为了在数的表示上消除编码映射的不唯一性,所以通过人为的定义对转换的10000000强制认定为-128。
因此,-128八位二进制下的原码和反码不存在,而八位二进制下的补码为10000000。
127的补码为01111111
所以使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]