1. 十进制的取模计算
现在我想要使另一个数加上2后用8取模后也等于1,这个数可以是哪些?
这个问题比较简单,只需要-1加上8的倍数即可
例如:
如果我们想要得到距离-1这个负数最近的一个正数7,直接使用-1+8即可。反过来想,其实可以理解成8减去-1的绝对值,如下图:
为什么要得到7这个数呢?而不是15,23等等这些-1加上8的倍数的数呢?这里透露一点,一正一负,刚好互补,具体原因后面会说明。在此我们可以把7看作-1的补码(补码只是一个名字而已)。
2.类比十进制取模计算到二进制
为了与前面的例子一致,假设现在我所使用的二进制的位数为3,并且是有符号数,所有的数如下:
接下来进行类比十进制的计算到二进制中:
此处这里的计算就奇怪了,为什么二进制这样计算得到的结果与十进制得到的结果不一样呢?具体原因在第3小节会解释。
此时我们先来类比第一小节中加上模长后的计算:
计算距离-1最近的一个正数:
此处的1000是为了类比8这个数,虽然在3位的有符号数中不能表示1000,但是我们可以假设这个数是存在的。
从这个地方可以看出,我们得到的二进制计算结果和十进制计算结果相同。
3.二进制中令人迷惑的一点
相信此时会有这样的问题出现:
为什么之前二进制和十进制直接计算到结果不同,但是对二进制和十进制求补码后的计算结果就相同了?
在我个人的理解中,我认为问题的关键之处在于对二进制的有符号数的正负号规定上,如果我们在有符号dd二进制数中,不使用0表示正数,1表示为负数,而是使用+表示正数,-号表示负数这样的计算会不会使结果变得正常呢?
类似这样:
接下来进行计算:
从这样的结果来看,十进制和二进制的结果是相同的。同时也证明了,二进制的有符号数计算之所以与十进制与十进制计算到结果不同的原因就在于这里的正负号。
那再具体一点的解释呢?因为我们知道,在计算机中只有01这样的两个数,无法像现实中直接使用+和-表示正负号。而如果直接使用1和0表示符号的话,在计算时,它们也会参与计算,其中0并不会影响计算,但是1会影响计算。因此在计算时,负数都会先转换成补码,然后再进行计算。
那为什么补码计算的结果就正确呢?这里留个伏笔,大佬也可以在评论区解释一下。
以上内容仅个人理解,如果有哪些说得不对的地方,在此提前感谢大佬请指正。