为什么要用补码?

为什么要用补码?此文章是本人在学习计算机组成原理时的总结,如有错误还请个位指正。学习是循序渐进的,在明白补码的秘密之前,我们得先了解真值、机器码、原码、反码。

学习是循序渐进的,在明白补码的秘密之前,我们得先了解真值、机器码、原码、反码

  1. 真值与机器码

    真值:二进制数也有正负之分,书写时用‘+’和’-‘来表示数据的符号,这种数据书写格式称为真值。如:+1101,-1101

    机器码:把符号位和数值一起编码表示的二进制数称为机器码或机器数。 常用的定点数机器码有:原码,反码,补码,移码等,不同的机器码有不同的特点。

  2. 原码

    原码就是符号化的数值,其编码规则是用1代表负号,用0代表正号。如:+1101的原码是[0000 1101],-1101的原码是[1000 1101]。

    能用原码作为机器码能正确的进行运算码?

    其一,先讨论原码的符号位是否能参与运算。先假设原码符号位能够参与运算。 那么

     例如1+(-5)
     [0000 0001]原+[1000 0101]原=[1000 0110]原=-6
     很明显,显然是错误的。
    

    所以我们得出一个观点:原码的符号位不参与运算。

    其二,若符号位不参与运算,那么要使得原码正确的计算出结果,加法需要“同号求和,异号求差”,减法需要“同号求差,异号求和”,求差时还要比较大小,用大数减去小数,最后的符合判断也相对复杂。

    其三,原码对0的编码不唯一。在原码表示中,[0000 0000]和[1000 0000]分别表示+0和-0,我的认识是0并无正负之分,这不符合规定。

    显然,用原码作运算是不方便的,原码在计算机中目前仅仅用于表示浮点数的尾码。 原码的优点在于,表示简单直观。

  3. 反码

    反码又称1的补码,其符号位与原码相同。当真值为正时,原码反码相同,当真值为负时,反码数值位为原码数值位取反。

    反码的符号位参与运算,但是运算结果不一定准确,同时也存在两个机器码0(1111 1111 and 0111 1111)

    我在学习过程中,看到大多关于反码的作用就是:反码只是用于求补码的一个中间码而已,在计算机中不用反码作运算。

  4. 补码

    补码其符号位与原码相同。当真值为正时,原码反码相同,当真值为负时,补码的数值为反码数值加1。

    那么能用补码作为机器码参与运算吗?

    其一,补码的符号位参与运算。

     例如:1+(-5)
     [0000 0001]补+[1111 1011]补=[1111 1100]补=-4。
     显然,补码带符号运算是正确的。而且我们发现:
     [1111 1100]按权展开-1*2^7+1*2^6+1*2^5+···+0*2^1+0*2^0=-4。
     则得出:补码符号位参与运算,并且可以按权展开。
     
    

    其二,补码能够正确的计算出结果。

     例如:8-5的计算。那么怎么进行减法运算呢?
    
     方法1:由补码性质知道:[-X]补=-[X]补,所以[Y]补-[X]补=[Y]补+[-X]补,既通过补码可以把减法变为加法。
    
     那么8-5=[0000 1000]补+(-5)补码
    
     在计算机里,负数的补码怎么求呢?
    
     我们知道5和(-5)是一对相反数
    
     相反数的求法:X+(-X)=0,可以联想到,[1111 1111]+1=0,那么只需把X各个位取反得到X0,那么,X0+X=[1111 1111],这时再加1就可以得到0,即X0+X+1=0。这里面,X加了X0和1,所以求相反数的步骤就是全位取反再加1。
     例如:
         5的补码:[0000 0101]
    
     所以已知5的补码[0000 0101],得出-5的补码[1111 1011],那么8-5=8+(-5)=[0000 1000]+[1111 1011]=[0000 0011]=3。
    
     方法2:
    
     在这里引入模的概念,模是一个数值计量系统的计量范围。既超过模的部分将被舍弃。在计算机中,二进制数据都有字长的限制,数据最高位的位权值就是模数。
    
     负数的补码=模数+该负数。
     对于8位二进制来说模数为2^8。
     那么8-5=8+2^8+(-5)=259(mod2^8)。
    

    其三,补码的0唯一。

         +0=[0000 0000]原=[0111 1111]反=[1000 0000]补=-128
         -0=[1000 0000]原=[1111 1111]反=[0000 0000]补=0

    由上两式可以知道,对于±0来说,+0对应补码的值为-128,而-0对于补码的值为0,所以补码的0是唯一的,而且相同位数二进制下,补码比原码和反码能多表示一个数,既-128。

    以上三点就是我们选择补码的原因。第一,符号位参与运算减少了硬件设计的成本和难度;第二,补码运算结果正确。第三,补码由唯一的0且能多表示一个数。

今天的文章为什么要用补码?分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23043.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注