• 原码、反码、补码的理解


    1)讨论原码之前首先需要了解两个概念:机器数和真值。

    a.一个数值在计算机中的二进制表示形式,就称为这个数值的机器数。机器数是带符号的,其中最高位是符号位,1表示负数,0表示正数。比如,

    1100 0000就是-64的机器数,即在计算机中的二进制表示形式。同样的,0100 0000就是64的机器数。

    b.真值:因为第一位是符号位,所以机器数的形式值并不是真正的数值。机器数中除符号位之外的二进制串表示的才是真值(当然要加上符号才是真正的值)。

    2)对于一个数,在计算机中如何表示呢?这就涉及到对其的编码问题,原码、反码、补码就是计算机中对数的三种编码方式。

    a.原码就类似于上述机器数的定义方式,一个数的原码就是符号位加上真值的绝对值,即第一位表示符号位,其余位表示值。

    -64的原码就是:1100 0000

    +64的原码就是:0100 0000

    计算机中只有加法器没有减法器,减法运算是转化为加法来进行的。以下举例说明使用原码进行加减法的过程:

    64+64=0100 0000 + 0100 0000=0 1000 0000=128

    64-64=64+(-64)=0100 0000+ 1100 0000=1 0000 0000=-0

    1-1=1+(-1)=0000 0001 + 1000 0001=1000 0010=-2  计算错误

    原码的表示方式存在的问题:

    1.存在+0、-0的情况(0000 1000)

    2.进行减法运算的时候,有些情况会计算出错(1-1=-2)

    b.为了解决减法运算会出错的情况,引入了反码的编码形式。对于正数,其反码与原码完全相同(原码表示下,加法是正确的,所以正数的反码保持与原码相同即可),而负数的反码是保持原码的符号位不变,所有位依次取反,就得到反码。以下分别给出+1,-1的反码形式,并使用反码进行减法运算:

    +1=[0000 0001]

    -1=[1111 1110]

    1-1=1+(-1)=0000 0001+1111 1110=1111 1111,结果是反码形式,需要将其转化为原码形式才能得到确切值,原码是1000 0000=-0。

    但是反码对于0的表示方法任然是有两种,这里以4 bit为例:

    0000 +0

    1111 -0

    c.采用了反码的形式之后,减法运算的结果是正确了的。不过对于0还是存在+0、-0的情况。为了解决这个问题,补码出现了。正数的补码就是其原码自身,负数的补码是在其反码的基础上+1。还是以+1、-1的补码形式说明:

    +1=0000 0001

    -1=1111 1111

    1-1=1+(-1)=1 0000 0000 丢掉最高位=0000 0000=0(正数的补码和原码相同,所以是0)。

    使用补码不仅解决了+0、-0的情况,而且还可以多表示一个最低数。下图以4 bit为例,说明了原码、反码、补码的”进化过程“:

    (参考:https://www.zhihu.com/question/20159860

    以下讨论原码和补码两种编码形式下,表示的取值范围。从上图易知,分别使用原码和补码,4 bits的取值范围是:

    原码:[-7,7](包含+0、-0)

    补码:[-8,7](只有一个0)

    两种编码方式都表示了16个数值,只是原码有+0、-0之分,而补码只有一个0(+0),没有-0,因此可多表示一个最小值-8。-8的补码推倒过程如下:

    -1-7=1111+1001=1000=-8,所以-8的补码是1000,其没有对应的反码和原码。

    而8 bits的范围是:

    补码:[-128,127] 1000 0000=-128

    因此对于n bits分别以原码、补表示的数值取值范围是:

    原码:[-(2^(n-1)-1),2^(n-1)-1]   有1个符号位,所以是n-1

    补码:[-(2^(n-1)),2^(n-1)-1]

    3)计算机中是以补码的形式表示数值的(起码是整数),编程语言也是以补码的形式表示数值的。

    根据负数的原码求补码有一个比较简单的计算方法:符号位保持不变。从最低位开始,直至遇到第一个1之前,之前的所有位保持不变。遇到第一个1之后,保留这个1,以后按位取反直到符号位后一位。

    根据负数的补码求其原码的方法:符号位保持不变,其余各位取反,然后再整个数加1。

    另外,两个二进制数相减,等于加上减数保持符号位不变,取反 +1,即使加上其补码。

    4)计算机只有加法器,将减法转化成加法,是利用了数学中的同余概念。

    参考:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

             https://www.zhihu.com/question/20159860

             http://www.cnblogs.com/wxf0701/archive/2008/08/14/1267639.html

         http://blog.csdn.net/liushuijinger/article/details/7429197

  • 相关阅读:
    MySQL修改时区的方法小结
    MYSQL日期 字符串 时间戳互转
    2017php经典面试题
    PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
    开放api接口签名验证
    MySql之ALTER命令用法详细解读(转)
    easyUI datagrid 清空
    webApi文档好帮手-apidoc使用教程
    驼峰命名和下划线命名互转php实现
    SQL Server 数据导入Mysql详细教程
  • 原文地址:https://www.cnblogs.com/lz3018/p/5213196.html
Copyright © 2020-2023  润新知