精华内容
下载资源
问答
  • 关于计算机世界的二进制 首先,问一个基本的问题。 负数在计算机中如何表示? 举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就...


    首先,问一个基本的问题。

    负数在计算机中如何表示?
    举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?
    很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。
    比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。
    但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用二进制补码(Two's Complement)表示负数。

    什么是二进制补码?

    它是一种数值的转换方法,要分二步完成:
    第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,00001000的相反值就是11110111。
    第二步,将上一步得到的值加1。11110111就变成11111000。
    所以,00001000的二进制补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示。

    不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,更直觉的方式难道不好吗?
    昨天,我在一本书里又看到了这个问题,然后花了一点时间到网上找资料,总算彻底搞明白了。

    二进制补码的好处

    首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。
    二进制补码就是最方便的方式,它的便利体现在,所有的加法运算可以使用同一种电路完成。
    还是以-8作为例子。
    假定有两种表示方法。一种是直觉表示法,即10001000;另一种是二进制补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?
    随便写一个计算式,16 + (-8) = ?
    16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
     00010000
    +10001000
    ---------
     10011000
    可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。
    现在,再来看二进制补码表示法。
     00010000
    +11111000
    ---------
    100001000
    可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,二进制补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。
    二进制补码的本质
    在回答二进制补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的。
    要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。
    已知8的二进制是00001000,-8就可以用下面的式子求出:
     00000000
    -00001000
    ---------
    因为00000000(被减数)小于00001000(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。
    所以,00000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:
    100000000
    -00001000
    ---------
     11111000
    进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:
     11111111
    -00001000
    ---------
     11110111
    +00000001
    ---------
     11111000
    二进制补码的两个转换步骤就是这么来的。

    为什么正数加法适用于二进制补码?

    实际上,我们要证明的是,X-Y或X+(-Y)可以用X加上Y的二进制补码完成。
    Y的二进制补码等于(11111111-Y)+1。所以,X加上Y的二进制补码,就等于:
    X + (11111111-Y) + 1
    我们假定这个算式的结果等于Z,即 Z = X + (11111111-Y) + 1
    接下来,分成两种情况讨论。
    第一种情况,如果X小于Y,那么Z是一个负数。这时,我们就对Z采用二进制补码的逆运算,求出它对应的正数绝对值,再在前面加上负号就行了。所以,
    Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y
    第二种情况,如果X大于Y,这意味着Z肯定大于11111111,但是我们规定了这是8位机,最高的第9位是溢出位,必须被舍去,这相当于减去100000000。所以,
    Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y
    这就证明了,在正常的加法规则下,可以利用二进制补码得到正数与负数相加的正确结果。换言之,计算机只要部署加法电路和补码电路,就可以完成所有整数的加法。
    -----------------------------------------------

    我的站点:https://neveryu.github.io/guestbook/

    Githubhttps://github.com/Neveryu

    新浪微博http://weibo.com/Neveryu


     




    更多学习资源请私信我的新浪微博...



    展开全文
  • 在 MATLAB 中计算有符号整数的二进制补码
  • 举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号...

    问一个基本的问题。

    负数在计算机中如何表示?

    举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?

    很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。

    但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用二进制补码(Two's Complement)表示负数。

    什么是二进制补码?

    它是一种数值的转换方法,要分二步完成:

    第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,00001000的相反值就是11110111。

    第二步,将上一步得到的值加1。11110111就变成11111000。

    所以,00001000的二进制补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示。

    不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,更直觉的方式难道不好吗?

    昨天,我在一本书里又看到了这个问题,然后花了一点时间到网上找资料,总算彻底搞明白了。

    二进制补码的好处

    首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。

    二进制补码就是最方便的方式,它的便利体现在,所有的加法运算可以使用同一种电路完成。

    还是以-8作为例子。

    假定有两种表示方法。一种是直觉表示法,即10001000;另一种是二进制补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?

    随便写一个计算式,16 + (-8) = ?

    16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:

     00010000
    +10001000
    ---------
     10011000

    可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。

    现在,再来看二进制补码表示法。

     00010000
    +11111000
    ---------
    100001000

    可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,二进制补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。

    二进制补码的本质

    在回答二进制补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的。

    要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。

    已知8的二进制是00001000,-8就可以用下面的式子求出:

     00000000
    -00001000
    ---------

    因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。

    所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:

    100000000
    -00001000
    ---------
     11111000

    进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:

     11111111
    -00001000
    ---------
     11110111
    +00000001
    ---------
     11111000

    二进制补码的两个转换步骤就是这么来的。

    为什么正数加法适用于二进制补码?

    实际上,我们要证明的是,X-Y或X+(-Y)可以用X加上Y的二进制补码完成。

    Y的二进制补码等于(11111111-Y)+1。所以,X加上Y的二进制补码,就等于:

    X + (11111111-Y) + 1

    我们假定这个算式的结果等于Z,即 Z = X + (11111111-Y) + 1

    接下来,分成两种情况讨论。

    第一种情况,如果X小于Y,那么Z是一个负数。这时,我们就对Z采用二进制补码的逆运算,求出它对应的正数绝对值,再在前面加上负号就行了。所以,

    Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y

    第二种情况,如果X大于Y,这意味着Z肯定大于11111111,但是我们规定了这是8位机,最高的第9位是溢出位,必须被舍去,这相当于减去100000000。所以,

    Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y

    这就证明了,在正常的加法规则下,可以利用二进制补码得到正数与负数相加的正确结果。换言之,计算机只要部署加法电路和补码电路,就可以完成所有整数的加法。

    展开全文
  • 【转】关于计算机二进制补码

    千次阅读 2011-05-19 09:30:00
    举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号...

    问一个基本的问题。

    负数在计算机中如何表示?

    举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?

    很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。

    但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用二进制补码(Two's Complement)表示负数。

    什么是二进制补码?

    它是一种数值的转换方法,要分二步完成:

    第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,00001000的相反值就是11110111。

    第二步,将上一步得到的值加1。11110111就变成11111000。

    所以,00001000的二进制补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示。

    不知道你怎么看,反正我觉得很奇怪,为什么要采用这么麻烦的方式表示负数,更直觉的方式难道不好吗?

    昨天,我在一本书里又看到了这个问题,然后花了一点时间到网上找资料,总算彻底搞明白了。

    二进制补码的好处

    首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。

    二进制补码就是最方便的方式,它的便利体现在,所有的加法运算可以使用同一种电路完成。

    还是以-8作为例子。

    假定有两种表示方法。一种是直觉表示法,即10001000;另一种是二进制补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?

    随便写一个计算式,16 + (-8) = ?

    16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:

     00010000
    +10001000
    ---------
     10011000

    可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。

    现在,再来看二进制补码表示法。

     00010000
    +11111000
    ---------
    100001000

    可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,二进制补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。

    二进制补码的本质

    在回答二进制补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的。

    要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。

    已知8的二进制是00001000,-8就可以用下面的式子求出:

     00000000
    -00001000
    ---------

    因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。

    所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:

    100000000
    -00001000
    ---------
     11111000

    进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:

     11111111
    -00001000
    ---------
     11110111
    +00000001
    ---------
     11111000

    二进制补码的两个转换步骤就是这么来的。

    为什么正数加法适用于二进制补码?

    实际上,我们要证明的是,X-Y或X+(-Y)可以用X加上Y的二进制补码完成。

    Y的二进制补码等于(11111111-Y)+1。所以,X加上Y的二进制补码,就等于:

    X + (11111111-Y) + 1

    我们假定这个算式的结果等于Z,即 Z = X + (11111111-Y) + 1

    接下来,分成两种情况讨论。

    第一种情况,如果X小于Y,那么Z是一个负数。这时,我们就对Z采用二进制补码的逆运算,求出它对应的正数绝对值,再在前面加上负号就行了。所以,

    Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y

    第二种情况,如果X大于Y,这意味着Z肯定大于11111111,但是我们规定了这是8位机,最高的第9位是溢出位,必须被舍去,这相当于减去100000000。所以,

    Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y

    这就证明了,在正常的加法规则下,可以利用二进制补码得到正数与负数相加的正确结果。换言之,计算机只要部署加法电路和补码电路,就可以完成所有整数的加法。

    (完)

    展开全文
  • 二进制补码计算原理详解

    万次阅读 多人点赞 2018-07-03 17:34:54
    二进制负数的在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最...

    二进制的负数在计算机中采用补码的方式表示。很多人很好奇为什么使用补码,直接使用原码表示多好,看上去更加直观和易于计算。然而事实告诉我们,这种直观只是我们人类的一厢情愿罢了,在计算机看来,补码才是它们最想要的。那么,为什么计算机使用补码更好,又是如何通过补码来计算数值的呢?

    我看过网络上很多解释补码的文章,几乎一致的回答就是符号位不变,其他各位逐位求反再加一。在此我想说,这些都不是根本原理。谁都知道这么求,数电第一章就明确写了怎么求,关键是为什么这么算,其中的原理是什么?

    本文主要的内容就是深入讲解补码的原理,其中内容有相互引用成分及计算机基础要求,不适合初学者阅读。当然,随便看看无所谓啦。

    1.什么是补码

        这个没有找到官方定义,只进行个人定义。   

        个人定义:补码是计算机中用来表示负数,使得负数能够使用加法器参与加法运算的一种码。

        加减是计算机中最常用的运算,加法一般使用加法器来实现,减法则使用减法器实现。那有什么办法可以将减法变为加法,这样就可以让系统只实现加法即可,答案就是补码。

        理解补码最简单的例子就是时钟。

        例1:

        假如一个时钟现在显示的是10点钟,如何将它调到6点钟?

        解:有两种方法,一是向后拨8个小时,二是向前拨4个小时

        在这个例子中,8 和 4 互为补数,也就是说4的补码是8,8的补码是4,而这个时钟的就是12

        注意:可能有人会想,在往后调8个小时虽然也调到了6点,但是他实际上比原来日期多了12小时。是的,的确如此,但是你的时钟有地方存储了这多余的12个小时吗?答案是没有,所以在你调完后,你没有记录这12个小时,换句话说,你把这溢出的12个小时自动舍弃了。当第二个人来查看闹钟时间的时候,他看到的时间就是准的。

        例2:

        一个数的数值是11,他的模是16,那么他的补码是多少?

        解:16-11 = 5,即补码就是5。

    2.模

       关于模没有找到固定的定义,简单来说模就是一个循环的周期,在例1中,时钟的一个周期就是12,所以模是12。一周的模是7天,一天的模是24小时。模是补码的一个重要概念。

    3.使用补码运算

       例3

       模为32,使用补码运算该算式16-13,13 - 16。

       解 16-13 = (16 + (32-13))% 32 = 35 % 32 = 3 

        13-16 = (13 + (32-16))% 32 = 29 % 32 = 29

    4.使用补码进行二进制运算    

        有看过数电基础的都应该记得,第一章就有说明二进制补码是如何运算的。正数的补码即为自己,负数的补码为符号位不变,其余逐位求反再加1。

        使用该定义,先通过例子求出数值,再对例子进行详细讲解,为什么可以使用负数的补码来运算。

        例4   通过二进制求15-11的值

        要想让减法变加法,必须转换算式为 15 + (-11)

        15为正数,符号位为0,二进制表示为 01111

         -11为负数,符号位为1,负数原码为  11011 ,补码符号位不变,其余逐位求反再 +1,即 10101

       所以 15 + (-11) = 01111 + 10101 = 100100 舍弃第一位溢出位,即00100,即+4

      这是一个最简单的补码算法运算的例子,却有很多不解之处。

     1.为什么负数 (-11 )逐位求反再+1就可以代表原来的数?

     2.为什么第一位舍弃

     3.为什么符号位能够参与运算

     先看问题1,-11 先不考虑符号,观察11的二进制表示,11使用二进制表示是 1011,将1011 逐位求反 得到 0100,因为是逐位求反,1011 +0100 = 1111 ,而1111 + 1 = 10000,发现了什么?10000是四位2二进制数的模。为什么10000是4位二进制数的模呢?原理也很简单,4位寄存器最高能表示什么数?即 (二进制)1111 = (十进制) 15 , 15 +1 =16 = (二进制)10000,后四位寄存器清0,所以模为16。

    所以不管几位二进制数,取反后得到的值加原码会刚好的到所有的位都是1的二进制数,再加一就刚好进位得到模。所以取反加一是无论如何都能取到补码的。比如 :(原)101 +  (补)((反)010 +1) = 8 ,(原)10 + (补)((反)01 +1)= 4。

    所以,负数符号位不变,其余逐位求反 +1 只是算出补码最简单的方法,而不是理论基础。

    前面提到过,使用补码代替原码,计算后模掉溢出得到数值就可以得到计算的值了。

    再看问题2,为什么高位舍弃,这个问题其实在例1中已经做了说明,因为你没有存储这个高位的空间,用最简单的解释来解释就是,一个4位的寄存器,只能存储数据的后四位,第一位进位没地方放,就像例1中多出来的12小时,没有地方存储,那么就丢弃了,反正结果正确就行。可能有人会问,你说丢弃就丢弃吗,丢了你怎么保证是正确的?

    重新再看一次例4,现在考虑符号位,将符号位加入运算。

    15 - 11 = 15 + (-11),其中 -11 为 11011(加了一位符号位,所以模为 16 * 2^1) 他的补码为 10101 = 21

    所以 15 -11 变为 15 +21 = 36 (01111 + 10101) ,原先是减一个数,变换后却变成了一个比减数更大的加数了,能不溢出吗。所以要模掉溢出位 36 % 32 = 4 。仔细观察被模数36 = 1 00100 你会发现,在第二位之前的所有高位都是32的倍数,所以用32进行模运算就会全部清0,这就是为什么高位可以直接舍弃的原因,因为高位永远会是模的倍数,在模的过程中会被清0。

    最后看问题3,为什么符号位能够参与运算,可能在这前面一直被符号位困扰,为什么参与运算就没有问题,看了这里的解释,我相信你将不会再被困扰。

    符号位对于我对二进制补码的理解产生了很大的阻碍,我不明白为什么符号位可以参与运算,而且算出来还是对的。花了不少时间理解了符号位的含义。

        首先放弃符号位就是计算机表示专门定义出来表示正数和负数用的这个思维,换成这样一种理解思路:我们观察计算机中一个二进制数,它没有专门的符号位,但是正数和负数在计算机中存储第一位二进制数会存在差异,如果它的第一位是0,那么他就是正数原码,如果它的第一位是1,那么他就是负数补码,我们通过观察第一位是0还是1即可知道这个数是正数还是负数。

    通过以下例子,可以发现符号位其实是算出来的。

    例5:计算机运算 9 - 12

     解:9 转五位二进制为 01001 //模为32(100000)

    因为12是减数,所以将12转为补码变为加数,方便参与加法运算

    12 = 01100(原) = 10011 + 1 = 10100(补)

    01001 + 10100 = 11101

    11101% 100000= 11101

    从结果看,我们可以发现,第一位为1,第一位如果是1,那么这个数值是负数补码,由此可知,这个数是一个负数,只是在计算机中,他表示为11101,反求原码,即可得到 (11101 - 1) 反 = 00011  = 十进制数 3,由此可知,11101表示的是负数的3

    从这个例子当中可以看到,在运算中完全没有考虑符号位,仅用单纯的加法运算进行运算,而得到的结果11101也没有人为去添加一个符号位,符号位是计算所得的,所以他才能参与运算我们应该反过来看符号位,正是在补码运算中,存在第一位为0则是正数,为1则是负数这个规律,我们才方便地认定第一位为符号位,符号位跟人为定义没有任何关系(人为定义的符号位不可能满足数学规则参与数学运算)。

     

    补充:在例5中可以发现,我们在第一位之前补了一个0,将四位二进制数补成五位二进制数来计算,为什么要补这个0呢?为了说明这个问题,我们来算一个错误的运算

    例6:计算机运算 0 - 12

    解 : 我们仅仅用四位二进制数(四位寄存器)来算

    12 = (二进制)1100 12转为二进制后是一个四位二进制数,它的模为10000

    因为12是减数,所以将12转为补码变为加数,方便参与加法运算

    12 = 1100(原) = 0011 + 1 = 0100(补)

    0000 + 0100 = 0100 = 4 ,第一位是0,说明是正数原码, 即运算结果为 +4

    4 != -12 运算出错

    通过结果发现,只用四位二进制数运算,结果是错误的,为什么会产生这种错误呢?因为寄存器位数不够,四位寄存器只能存储 0 -15 的数值,没有多余的寄存器位置用来表示这个数的正负,我们虽然算出了符号位,但是计算后所得到的符号位却没有地方存放,导致符号位缺失,我们又误将四位二进制数结果的第一位当做符号位来判断数的正负,才会出现错误的结果。

    通过例5我们可以知道,符号位是计算后得出来的,所以我们要预先要在寄存器第一位留出一个位置存放计算后得出的符号位,所以我们先在第一位前面补一个0占位。

    由此可知: 要想计算结果正确, 需要满足 : 寄存器位数 >= max(操作数1,操作数2,....) 的二进制位数加一位

     

    最后,附上一张五位二进制数运算转换关系图,自己体会二进制数如何带着所谓的符号位在计算机中运算:

    六位二进制运算转换关系图

    有如下几点:

    1:五位二进制数的所有正数都在圆环的黑线上,而负数都在圆环的红线上,如果在黑线上,那么六位寄存器第一位必为0,而在红线上,那么第一位必为1,我们也是通过这个位来判断数值的正负

    2:五位二进制数运算结果取模后如果在黑线上,那么为正数,否则为负数

    3:尝试写几个数字转为五位二进制数或者写几个算式对号入座,观察是否符合,加深理解

    到这里补码的原理就差不多讲清楚了,无非是使用模进行转化,但是我们站在十进制的角度,去看二进制的东西,的确会显得相当费解。最后我想说,能发明补码来计算的数学家真的是太厉害了。

    内容有相互嵌套成分,阅读后回顾前面的内容可能会更加深入理解。

    还有很多特殊情况没有考虑,只讲解了最核心的内容。

    本文纯属个人理解,如有纰漏,请勿拍砖。

     

     

    展开全文
  • 今天一场技术笔试一道编程题难住了我,算出一个十进制数的二进制补码和对应的16进制,由于时间紧张,加上紧张,做的极差,因此mark以下
  • 二进制补码到十进制补码及其内的运算——关于补码的一点学习
  • 关于二进制补码

    热门讨论 2016-09-29 23:53:10
    关于二进制补码16340146 学院 目录关于二进制补码 二进制补码介绍1 二进制补码的证明 数字溢出2 附表 Binary Octal Hexa 0000 0 0 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 ...
  • 二进制补码

    千次阅读 2017-09-17 20:39:05
    二进制补码 1.概述  计算机系统的内部是以二进制形式存储数据。  在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。 2.补码规则  ...
  • 使用二进制补码表示二进制负数方法合理性的证明 目录 使用二进制补码表示二进制负数方法合理性的证明 二进制补码的定义 补码与反码的关系 定理 1 计算机中二进制负数 定理2 注释 二进制补码的定义...
  • 负数的二进制补码表示这样计算。 1:先将负数中的负号去掉变成正数,使用二进制表示这个正数 2:将这个二进制正数所有的位取反,再加1,结到的二进制序列就是这个负数的补码 比如:-1,取其正值1,32位二进制表示为...
  • 二进制补码乘法及其FPGA实现 二进制补码乘法及其FPGA实现 PDF格式
  • 十进制转二进制补码(正负都可) 指针初学 将一个十进制正(负)整数转换为对应的二进制补码(用指针完成 十进制转二进制:1.先判断该整数是正数还是负数 如果是正数则二进制补码首位为1 , 且对应的二进制补码就是原. 如果...
  • 输出二进制补码

    千次阅读 2014-05-23 18:17:08
    * 2:输出二进制补码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入若干int型整数,输出每个整数的二进制补码。 输入 输入有若干行,除最后一行外,每行包含一个int型整数。最后一行仅包含...
  • 二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制数可以使用两种方法相乘, Paper method: Paper method is similar to multiplication ...
  • 该库包含用于计算十进制数的二进制补码的函数,反之亦然; 二进制补码表示形式既可以二进制表示,也可以十六进制表示。 这些函数支持使用-2147483648至2147483647的32位整数,因为它们使用了JavaScript的按位运算符...
  • 0.1.2 二进制补码

    2014-09-03 13:44:00
    《编程导论(Java)·0.1.2 二进制补码》 p6:【冯•诺伊曼体系结构计算机使用二进制。人类之所以习惯十进制,据说是由于用手指头来计算比較方便,而人正好有10个指头。】 本节就2面(page6和p7)纸。尽管二进制...
  • 一眼看懂二进制补码计算方法

    千次阅读 2017-10-16 23:08:28
    二进制补码计算方法二进制补码计算方法最近,我仔细研究了下linux下,C程序的编译和链接过程。反汇编和查看二进制时,难免看到大量整数的二进制表示,特别是负数,例如0xfffffffc,这个是多少?记得有个转换方法...
  • matlab十进制转二进制补码函数

    千次阅读 2019-12-22 23:48:17
    matlab十进制转二进制补码函数 函数代码 读者可根据需求对函数进行更改。 %%十进制整数转二进制反码 function Bin = dTobin(N,M)%N表示位数,M表示十进制数, if (M >= 0) Bin = dec2bin(M, N); % 正数的反码...
  • 关于二进制补码表示法的一些备忘

    千次阅读 2013-10-19 17:02:33
    几乎所有的计算机都使用二进制补码表示法来存储有符号整数,而不是用所谓的符号加绝对值表示法。 1)非负整数的二进制补码为其原样,直接转化为二进制即为其二进制补码。 也就是说,当你定义一个int n=1是,在计算机...
  • 输出二进制补码问题

    2020-04-13 22:39:34
    蒜头君有一个 int\text{int}int 的整数,输出它的 323232 位二进制补码。 输入格式 一个整型整数。 输出格式 输出一行,即该整数的补码表示。 输出时每行末尾的多余空格,不影响答案正确性 样例输入: 7 样例输出 ...
  • 二进制补码表示数

    2019-09-04 17:20:35
    -33的补码表示: ...N位补码进行运算,为使运算不发生溢出,需要N+1位来表示数据,比如上述+33二进制补码表示为: 0100001,用8位表示为:00100001 -33用补码表示为:1011111,用8位表示为:11011111 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,229
精华内容 24,091
关键字:

如何计算二进制补码