二进制负数减法运算为什么要按位取反再加一

前言

      从开始接触编程书上就有介绍原码、反码、补码,二进制中减去一个负数的时候,直接运算是会出错的(00001111-10000001=10001110=-14与预期15-(-1)=16有很大偏差),大家都知道00001111加上10000001这个负数的补码就可以得到正解,但是为什么要加上这个数的补码呢?补码为什么就是按位取反再加一呢?正数的补码为什么就还是原码呢?

思考

  1. 正数的反码为什么就不用取反呢?

      因为二进制运算中规定了正数首位用0表示,计算规则其实跟我们平常计算规则是一样的。(如18-06=? 012-013=?)并不会对计算结果产生影响。如果规定用1表示正数的话,那么又是不一样的结果,这个我们不进行讨论。

  1. 减去一个负数为什么就等于加上这个负数的补码?

      同理于十进制中的绝对值运算,10-(-8) = 10+|-8| = 10+8,8与-8互为相反数,相信这里大家也能理解补码的概念了,对,就是相反数。0-x=x的相反数。10000001的补码是11111111,大家可以自行测试一下10000001+11111111是不是等于0?

  1. 补码为什么就是按位取反再加一呢?

      看完第二个问题可能又会想,二进制数的补码(相反数)为什么这么奇怪呢?10000001(十进制等于-1)与 11111111(十进制等于-127)竟然互为补码(相反数)?其实我们把这些数全部列出来就一目了然了。

image

      上图可以看出一切都是有规律的。下面的负数的相反数其实就是一个首尾相连的过程。

结论

      关键在于理解补码就是相反数这个概念。

念念不忘,必有回响。