• 原码、反码、补码


    数在计算机中是以二进制形式表示的。 
    数分为有符号数和无符号数。 
    原码、反码、补码都是有符号定点数的表示方法。 
    一个有符号定点数的最高位为符号位,0是正,1是副。 
     
    以下都以8位整数为例, 
     
    原码就是这个数本身的二进制形式。 
    例如
    0000001 就是+1
    1000001 就是-1 
     
    正数的反码和补码都是和原码相同。 
     
    负数的反码是将其原码除符号位之外的各位求反 
    [-3]反=[10000011]反=11111100 
    负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。 
    [-3]补=[10000011]补=11111101 
    一个数和它的补码是可逆的。 
     
    为什么要设立补码呢? 
     
    第一是为了能让计算机执行减法: 
    [a-b]=a+-b)补
     
    第二个原因是为了统一正0和负0 
    正零:00000000 
    负零:10000000 
    这两个数其实都是0,但他们的原码却有不同的表示。 
    但是他们的补码是一样的,都是00000000 
    特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!) 
    [10000000]补 
    =[10000000]反+1 
    =11111111+1 
    =(1)00000000 
    =00000000(最高位溢出了,符号位变成了0) 
     
    有人会问 
    10000000这个补码表示的哪个数的补码呢? 
    其实这是一个规定,这个数表示的是-128 
    所以n位补码能表示的范围是 
    -2^(n-1)到2^(n-1)-1 
    比n位原码能表示的数多一个
     
    又例:
    1011 
    原码:01011 
    反码:01011 //正数时,反码=原码 
    补码:01011 //正数时,补码=原码 
     
    -1011 
    原码:11011 
    反码:10100 //负数时,反码为原码取反 
    补码:10101 //负数时,补码为原码取反+1 
     
    0.1101 
    原码:0.1101 
    反码:0.1101 //正数时,反码=原码 
    补码:0.1101 //正数时,补码=原码 
     
    -0.1101 
    原码:1.1101 
    反码:1.0010 //负数时,反码为原码取反 
    补码:1.0011 //负数时,补码为原码取反+1 
     
    在计算机内,定点数有3种表示法:原码、反码和补码
     
    所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
     
    反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
     

    补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

    两正数相加怎么变成了负数???

    1)(+72)+(+98)=?

    0 1 0 0 1 0 0 0 B +72

    0 1 1 0 0 0 1 0 B +98

    1 0 1 0 1 0 1 0 B -86

    两负数相加怎么会得出正数???

    2)(-83)+(-80)=?

    1 0 1 0 1 1 0 1 B -83

    1 0 1 1 0 0 0 0 B -80

    0 1 0 1 1 1 0 1 B +93

    思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?

    答案:这是因为发生了溢出。

    如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是 -2的n-1次幂≤X≤2的n-1次幂-1

    当n=8时,可表示的有符号数的范围为-128~+127。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围时,就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。

    对于加法运算,如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时,或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时,都将发生溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。

    而对于减法运算,当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围),或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围),也会出现溢出。

    在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。

    在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负;其余n-1位为数值位,各位的值可为零或一。当真值为正时,原码、反码、补码数值位完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。注意符号位不变。

  • 相关阅读:
    NetworkX-根据权重画图
    Matplotlib 画廊
    NetworkX-画图
    NetworkX-simple graph
    python+networkx
    AttributeError: 'module' object has no attribute 'X509_up_ref'
    python Flask post 数据 输出
    windows环境下批处理实现守护进程
    supervisor自启动
    支持高并发的IIS Web服务器常用设置
  • 原文地址:https://www.cnblogs.com/KYin/p/9752014.html
Copyright © 2020-2023  润新知