原码,补码,反码


1. 二进制表示一个数字,第一位表示符号位

+1 :  0000 0001

+2:   0000 0010

-1:  1000 0001

-2:  1000 0010

问题来了,如果只用取反 加减二进制数字来表达 数字的加减, 因为计算机机器只会加法

1. 正数相加,没问题  0000 0001   + 0000 0010  = 0000 0011

2. 正数相减, 有问题, 1-2 = 1 + (-2) = 0000 0001  +  1000 0010  = 1000 0011 = -3 ,这个明显不对。

然后就想到了一个办法,就是取反   1-2 = 1 + (-2) = 0000 0001 + 1111 1101 = 1111  1110  再取反= 1000 0001 = -1 可以了,

反码是什么,死记硬背就行: 正数的反码=正数 负数的反码= 负数取反,符号位不变.

那么 -1 + -2 = 1000 0001 + 1000 0010 =  1111 1110 + 1111 1101 = 1000 011 = -3  正确

1-1 = 0000 0001 + 1000 0001 = 0000 0001 + 1111 1110 = 1111 1111 = 1000 0000 =-0; 正确

-1 + 2 = 1000 0001 + 0000 0010 = 1111 1110 + 0000 0010 = 0000 0000 = 0; 错误 实际结果是1

-2 + 4 = 1000 0010 + 0000 0100 = 1111 1101 + 0000 0100 = 0000 0001 = 1; 错误 实际结果是2

可以看到,这个结果和实际结果偏差1,那么好说,只需要让负数的反码再加1就好了,这就叫反码。

所以

-1 + 2 = 1000 0001 + 0000 0010 = 1111 1110 + 1 + 0000 0010 = 0000 0000 + 1 = 0 + 1; 正确

-2 + 4 = 1000 0010 + 0000 0100 = 1111 1101 + 1 + 0000 0100 = 0000 0001 + 1 = 1+1; 正确

这样就解释了原码,补码,反码了。