写点什么

为什么补码是取反加 1?

作者:Dinfan
  • 2023-02-13
    广东
  • 本文字数:549 字

    阅读完需:约 2 分钟

网上随便一搜关于补码的文章,基本都是:用原码得出反码,然后再加 1,就能得出补码。

首先不能否定这个方法的正确性,但却体现不出计算机的精妙之处。


先介绍一下补码的作用和原本的计算方法:

1、二进制的原码及正负表示

比如现在有一个 4 位长度的二进制数,那么最高位用来作为符号位区分,比如 0010 代表 2,1001 代表-1

但是用原码计算 1+(-1)的时候,结果是不对的。会等于 1011 即-3

2、补码:负数原码取反+1

那么怎么解决原码计算不正确的问题,便引入了负数取反+1 的表示方法,比如 0010 依旧代表 2,但是用 1001 的反码+1(符号位不变,其余位取反):1111 来代表 -1。此时 2+(-1)=0010+1111(补码)=0001(补码)=0001(补码)=1,结果是正确的。

把原本的计算过程弄清楚之后,会不会引发一种想法:为什么补码就得是取反+1 呢?

补码与时钟

在一个表盘里面,12-1=11 点 与 12+11=11 点是等效的,相当于时针往前拨和往后拨的区别。假如这个时钟是 16 小时呢,那么-1 与 15 也是等效的。而 15 的二进制 1111 刚好等于-1 的补码。并且这样计算机就可以用加法来替代减法了。

到这里是不是明白了?取反加 1 只是补码的一种快捷计算的方式,而不是补码的定义。这个推理的过程恰恰就是补码的精妙之处。换个说法,在表盘里面补上 11 刚好就是减 1,所以就叫补码(complement)吧

这个过程其实有严谨的数学推导,这里就不涉及了。

发布于: 刚刚阅读数: 5
用户头像

Dinfan

关注

还未添加个人签名 2018-03-21 加入

还未添加个人简介

评论

发布
暂无评论
为什么补码是取反加1?_Dinfan_InfoQ写作社区