计组:计算机为何有反码补码?不列公式!

你是如何作减法的?

200-134=? 相信这个问题难不倒你,读到这句话的时候,你可能已经口算出了答案。让咱们慢一点,来看看咱们是如何一步一步作减法的。
​ 你的脑海里可能浮现出了一个词:借位。没错,减法比加法麻烦的就是,它没有进位,但有借位这个烦人的东西。对于这道题,将它写成竖式,从最右边那一列入手,0是小于4的,因此往左边借一位,再用10减去4获得6。由于咱们往左边的0借了一位,因此实现上这时的0应该变成-1,-1是小于3的,因此咱们又要往左边借一位。你看,借位是多么的麻烦!code

那该如何是好呢,大人?

​ 那么如何经过逻辑门来实现这个逻辑呢?嘿!嘿!嘿!看字,别再想了,你简直是在折磨本身,为了让本身好过一点,咱们须要想办法来回避借位操做:
​ 什么状况下,被减数不须要借位?格叽,格叽,格叽格叽,开动你的脑筋。没错,每一位都是9的时候!这里的操做数是3,因此咱们取3个9减去134。it

从一串9中减去一个数,称为对9求补数io

​ 那么如今,原式变成了这样class

\[200+(999-134)-999 \]

​ 由于200-102是个整数,再加上999就进位了。因此咱们不妨把减999变成减1000,这样作减法的时候好算一点二进制

\[200+(999-134)+1-1000 \]

​ 这样,咱们就回避了借位。在十进制中是取对9的补数,那么在二进制中就是使用1了,上面的例子可化为:方法

\[\begin{equation}\begin{split} 11001000\\ -10000110\\ \hline \end{split}\end{equation} \]

​ 第一步,咱们用11111111(十进制中为255)减去减数:计算机

\[\begin{equation}\begin{split} &{11111111}\\ -&{10000110}\\ &\hline {01111001} \end{split}\end{equation} \]

​ 在二进制中,对1求补数能够不用减法,由于1减去1为0,1减去0为1,只须要按位取反便可。因此对1求补数,也能够称为相反数或者反码di

​ 第二步,把减数对1的补数与被减数相加co

\[\begin{equation}\begin{split} {01111001}\\ +{11001000}\\ \hline {101000001} \end{split}\end{equation} \]

​ 第三步,将所得结果加1display

\[\begin{equation}\begin{split} {101000001}\\ +{1}\\ \hline {101000010} \end{split}\end{equation} \]

​ 第四步,将所得结果减去100000000(十进制中的256):

\[\begin{equation}\begin{split} {101000010}\\ -{100000000}\\ \hline {001000010} \end{split}\end{equation} \]

​ 结果001000010至关于十进制的66

有符号数的减法

​ 在计算机中,咱们只有0和1,可没有负号告诉咱们这个数是负数。那么如何来表示负数呢?最简单的固然是用一个二进制数表示负号,当这一位为0时表示正数,当为1时表示负数。不过,根据咱们上面的方法,咱们用求补数的办法规定正负数,还能轻松的将正负数相加。不过这种方法也不是十全十美的,缺点就是你得提早知道可能遇到的全部数字的位数。

​ 若是你的花呗额度是500,而且你的余额不超过500,那么你的额度应该在-500到499之间,那咱们就能够把:

\[-500,-499,-498....-2,-1,0,1,2...497,498,499 \]

写成

\[500,501,502...998,999,000,001,002...497,498,499 \]

​ 这种机制在二进制中称为2的补数。(求2的补数就是先求1的补数再加1)通俗点就是将0到1000分红两半,前一半为正,后一半为负。对应到二进制就是,1开头的为负数,0开头的为正数。跟一开始的用特定二进制位表示正负数从这里来看,没有什么区别。01嘛,二进制。

​ 如今134-200就至关于134加上-200:

\[\begin{equation}\begin{split} 010000110\\ +100111000\\ \hline 110111110 \end{split}\end{equation} \]

​ 10111110是1000010(66)对2的补数,又110111110首位是1表明是负的,因此结果是-66

相关文章
相关标签/搜索