计组:计算机为什么有反码补码?不列公式!
你是如何做减法的?
200-134=?
相信这个问题难不倒你,读到这句话的时候,你可能已经口算出了答案。让我们慢一点,来看看我们是如何一步一步做减法的。
你的脑海里可能浮现出了一个词:借位。没错,减法比加法麻烦的就是,它没有进位,但有借位这个烦人的东西。对于这道题,将它写成竖式,从最右边那一列入手,0是小于4的,所以往左边借一位,再用10减去4得到6。因为我们往左边的0借了一位,所以实现上这时的0应该变成-1,-1是小于3的,所以我们又要往左边借一位。你看,借位是多么的麻烦!
那该如何是好呢,大人?
那么如何通过逻辑门来实现这个逻辑呢?嘿!嘿!嘿!看字,别再想了,你简直是在折磨自己,为了让自己好过一点,我们需要想办法来回避借位操作:
什么情况下,被减数不需要借位?格叽,格叽,格叽格叽,开动你的脑筋。没错,每一位都是9的时候!这里的操作数是3,所以我们取3个9减去134。
从一串9中减去一个数,称为对9求补数
那么现在,原式变成了这样
因为200-102是个整数,再加上999就进位了。所以我们不妨把减999变成减1000,这样做减法的时候好算一点
这样,我们就回避了借位。在十进制中是取对9的补数,那么在二进制中就是使用1了,上面的例子可化为:
第一步,我们用11111111(十进制中为255)减去减数:
在二进制中,对1求补数可以不用减法,因为1减去1为0,1减去0为1,只需要按位取反即可。所以对1求补数,也可以称为相反数或者反码
。
第二步,把减数对1的补数与被减数相加
第三步,将所得结果加1
第四步,将所得结果减去100000000(十进制中的256):
结果001000010
相当于十进制的66
有符号数的减法
在计算机中,我们只有0和1,可没有负号告诉我们这个数是负数。那么如何来表示负数呢?最简单的当然是用一个二进制数表示负号,当这一位为0时表示正数,当为1时表示负数。不过,根据我们上面的方法,我们用求补数的办法规定正负数,还能轻松的将正负数相加。不过这种方法也不是十全十美的,缺点就是你得提前知道可能遇到的所有数字的位数。
如果你的花呗额度是500,并且你的余额不超过500,那么你的额度应该在-500到499之间,那我们就可以把:
写成
这种机制在二进制中称为2的补数。(求2的补数就是先求1的补数再加1)通俗点就是将0到1000分成两半,前一半为正,后一半为负。对应到二进制就是,1开头的为负数,0开头的为正数。跟一开始的用特定二进制位表示正负数从这里来看,没有什么区别。01嘛,二进制。
现在134-200
就相当于134加上-200:
10111110是1000010(66)对2的补数,又110111110首位是1代表是负的,所以结果是-66