再谈反码和补码
2023-04-04 20:58 作者:yidadakimasi | 我要投稿
几天前我写了一篇关于原码反码和补码的文章,在这里。
里面有一个观点:补码是把减法变成了加法,这个观点是有问题的。特此修正。
按照书上介绍这几个码的先后顺序,我们可以看出一些端倪。先有的原码,再有反码,然后反码有一些小问题,又引入了补码,肯定是有什么不满意的地方才引入新的概念来解决这个问题的,对不。
为什么说 ”补码是把减法变成了加法,这个观点是有问题的“ 这个观点是错误的呢?
其实反码才是把减法变成了加法。
不信可以看这里。
1-45,我们计算这个不用补码就用反码就能解决。
把1转换为反码,结果是1
把-45转换成反码。45的原码是0010,1101,那么只需要把最高位的0改成1,就得到了-45的原码,即1010,1101,那么它的反码就是1101 0010
现在把0000 0001和1010 1101加起来。
0000 0001
+
1101 0010
=
1101 0011
最开始我们计算的是1-45 是一个减法,这里我们是用二进制的加法计算的,也就是说用了反码之后就已经把减法变成加法了。
最后的结果是1101 0011,它是一个反码,那么它对应的十进制数是多少呢?
按照反码的规则逆过程,符号位不变,其它位取反得到1010 1100,这是一个原码,对应的十进制数就是-44
1-45 用十进制计算的结果就是-44,结果吻合。
既然反码已经把减法转换成加法这个问题解决了,为什么还要引入补码
那是因为还有一个小问题没有解决,就是+0和-0的问题。
+0的反码是0000 0000 ,-0的反码是1111 1111, 同一个数有两个反码,怎么让它相同呢?
给-0的反码加一个1,得到0000 0000,这正好就是+0的反码。
所以说反码的引入是把减法变成加法,补码的引入是解决+0和-0的反码不一样的问题的。