大学的课本,或者网上算补码的方式,都是说正数的原码,反码,补码一致,负数的补码等于反码加1,雅思考试时间为什么负数的补码是等于反码加1呢?我们慢慢来推导。
通过上边的钟表我们可以通过顺时针走多少格来计算负数的补码,但是对于位数非常多的二级制,比如32位,64位,我们不可能通过画类似的时钟来算补码,所以我们就得有个公式能够非常方便的计算出补码,这时候反码就应运而生了。
我们从上边计算补码的公式中知道,对于负数的补码
[y]补 = [y]原 + 模 (y<0)以上边的4位2进制来解释这个公式
[1010(-2)]原 = [1110(14)]补 = [1010(-2)]原 + [16]模同时我们知道模就是溢出,所以 [ 模 = 1111 + 1 ] 于是上边的公式就转为
[1010(-2)]原 = [1110(14)]补 = [1010(-2)]原 + [16]模 = [1010(-2)]原 + 1111 + 1综上,我们把 [1010(-2)]原 + 1111 称为反码,因为要计算一个数与另一个数的结果为1111是非常容易的,只需符合位不变,其余求反即可,1010 -> 1101。再通过上边的推导公式,将反码加1就得到了补码,1101+1->1110。通过上边的推导我们知道了为什么补码是等于反码加1。
其实还有另个更快的计算补码的小窍门,对于负数的原码,保留原码的符号位,然后从右往左开始,直到遇到1之前都保持不变(包括遇到的第一个1),其余取反,如下,[]框起来的是不变的,加粗是取反的
1010 -> [1] 1 [10] ->1110
11010000 -> [1] 01 [10000] ->10110000