假设你要给手表调时间,从4点调到3点,只需要把指针倒着转一格就行了
但是这个手表不能倒转只能正转,该怎么办呢?聪明的你立刻想到,我只要正转11格,指针也能从4指向3
你把这个规律总结起来,就是倒转一格和正转11格等价,用数学表示就是-1和+11等价。同样还有,-2和+10,-3和+9等价,以此类推。
你可以总结一个公式,一个负数只要加上12,就和对应的正数等价。以后在这个表上不需要负数,不需要减法,一切都用正数加法代替。
恭喜你发明了计算机中的补码。
补码就是在二进制数上,用正数代替负数,用加法代替减法,这样只需要一个加法器就能完成加减法运算,且不需要区分正负数。
具体来说,一个8位二进制数可以表示256个数(类似表盘上总共有12个数),任何一个数加上256,都相当于指针转12格回到原位,得到的数和原数等价
求一个负数的等价正数(也就是补码),只需要把它加上256,比如-1的等价正数是255,二进制是1111,1111,而-128的等价正数是+128,二进制是1000,0000。
要计算某个数减1,我们不需要制作减法器,只需要把它加上255(和-1等价),就能得到这个数倒退一格的数,也就完成了减1。
而许多教材中说的“取反加一”,其实就是加256的另一种说法。
实际上8位二进制能表示的最大数是255,并不存在256。
这里巧妙利用加法结合律,先加255再加1。
而一个负数加255,刚好是它的绝对值取反。
更加巧妙的是,对于计算机来说,取反比加法还快。
作者:gwb
链接:https://www.zhihu.com/question/352057791/answer/1898969182856517598
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。