• 原码、反码、补码


    一、概念讲解

    机器数:

    一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,0表示正数,1表示负数。

    例如:+2二进制数:0(符号位)000 0010;-2二进制数:1(符号位)000 0010。

    其中,0000 0010和1000 0010就是机器数。

    真值:

    因为第一位是符号位,所以机器数的形式值就不等于真正的数值。

    例如,上面1000 0010,其中,最高位1代表负数,而其真正的数值是-2而不是242(1000 0010转换为十进制为242)。

    所以,为区别起见,将带符号的机器数对应的真正数值称为机器数的真值。

    例如:0000 0010 = +000 0010 = +2;1000 0010 = -000 0010 = -2。

    二、具体内容

    原码:

    原码就是符号位加上真值的绝对值。

    +2 = 0000 0010[原]
    -2 = 1000 0010[原]

    取值范围。

    [1111 1111, 0111 1111]   ==>   [-127, 127]

    反码:

    反码就是,正数的反码是其原码本身,负数的反码是原码基础上,符号位不变,其余位取反。

    +2 = 0000 0010[原] = 0000 0010[反]
    -2 = 1000 0010[原] = 1111 1101[反]

    取值范围。

    [1111 1111, 0111 1111]   ==>   [-127, 127]

    补码:

    补码就是,正数的补码是其原码本身,负数的补码是反码基础上,+1。

    +2 = 0000 0010[原] = 0000 0010[反] = 0000 0010[补]
    -2 = 1000 0010[原] = 1111 1101[反] = 1111 1110[补]

    取值范围。

    [1000 0000, 0111 1111]   ==>   [-128, 127](-128只有补码,没有原码、反码)

    为什么会用到反码和补码?

    //原码。
    1 + (-1) = 0000 0001[原] + 1000 0001[原] = 1000 0010[原] = -2(结果错误,于是,出现了反码。)
    //反码。
    1 + (-1) = 0000 0001[反] + 1111 1110[反] = 1111 1111[反] = 1000 0000[原] = -0(结果正确,现有+0[0000 0000][原]、-0[10000 0000][原],
    但是0无正负之分,并且只能有一个0,于是,出现了补码。)
    //补码。
    1 + (-1) = 0000 0001[补] + 1111 1111[补] = 0000 0000[补] = 0000 0000[原] = 0(用0000 0000表示0,用1000 000表示-128。)
    
    (-1) + (-127) = 1000 0001[原] + 1111 1111[原] = 1111 1110[反] + 1000 0000[反] = 1111 1111[补] + 1000 0001[补] =1000 0000[补] 
    = -128(-128只有补码,没有原码、反码。)

    使用补码,不仅修复了0的符号以及存在两个编码问题,而且还能多表示一个最低数(-128)。

    以上是我对原码、反码、补码的理解,希望可以给需要的朋友带来帮助。

  • 相关阅读:
    如何搜索IP的地理位置
    Windows Sockets错误标识及对应解释
    【转】GDB中应该知道的几个调试方法
    手动安装OpenCV下的IPP加速库
    Ubuntu16.04调整屏幕分辨率至1920*1080
    win10家庭版删除文件提示没有权限最简单的方式
    Centos7 HyperLedger Fabric 1.4 生产环境部署
    解析key值不确定的json数据
    (转)Centos下,Docker部署Yapi接口管理平台
    (转)手工释放linux内存——/proc/sys/vm/drop_cache
  • 原文地址:https://www.cnblogs.com/DingALing/p/12157903.html
Copyright © 2020-2023  润新知