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


    你是如何做减法的?

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

    那该如何是好呢,大人?

    ​ 那么如何通过逻辑门来实现这个逻辑呢?嘿!嘿!嘿!看字,别再想了,你简直是在折磨自己,为了让自己好过一点,我们需要想办法来回避借位操作:
    ​ 什么情况下,被减数不需要借位?格叽,格叽,格叽格叽,开动你的脑筋。没错,每一位都是9的时候!这里的操作数是3,所以我们取3个9减去134。

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

    ​ 那么现在,原式变成了这样

    [200+(999-134)-999 ]

    ​ 因为200-102是个整数,再加上999就进位了。所以我们不妨把减999变成减1000,这样做减法的时候好算一点

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

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

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

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

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

    ​ 在二进制中,对1求补数可以不用减法,因为1减去1为0,1减去0为1,只需要按位取反即可。所以对1求补数,也可以称为相反数或者反码

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

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

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

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

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

    [egin{equation}egin{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:

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

    ​ 10111110是1000010(66)对2的补数,又110111110首位是1代表是负的,所以结果是-66

  • 相关阅读:
    Fast data loading from files to R
    php的循环与引用的一个坑
    让我安静的写会儿代码
    chrome一个奇怪的问题
    用原生js给DOM元素添加、删除一个类名
    在ie浏览器下背景图片不显示的解决办法
    伪元素选择器之 ::placeholder
    基础版放大镜--面向对象
    元素尺寸大全
    如何解决PC端和移动端自适应问题?
  • 原文地址:https://www.cnblogs.com/AD-milk/p/12737812.html
Copyright © 2020-2023  润新知