• 原码反码补码疑惑解答记录:127+1=-128



    前置知识

    正数:

    原码符号位为0
    原码=反码=补码

    负数:

    原码符号位为1
    反码=原码除最高位以外,按位取反或者负数对应绝对值的原码全部按位取反
    补码=反码+1


    解析

    计算机的运算在其内部是按照补码的形式计算的。
    由于减法电路相较于加法电路造价更加昂贵,因此诞生的补码正是为了将减法变为另一种形式的加法而存在的。
    补码:将减法运算转化为另一种形式的加法运算

    127+1在计算机内 = [127]补+[1][127]= 0,1111111
    [1]= 0,0000001
    [127]补+[1]= 1,0000000
    
    • 1
    • 2
    • 3
    • 4

    我们所得到的数最高位为1,因此这是一个负数的补码
    那么这个负数是多少呢?补码不好直接看出其原码形式。

    但这时候的推导过程就需要注意了:

    反码=`原码除最高位以外,按位取反`或者`负数对应绝对值的原码全部按位取反`
    补码=反码+1
    也就是补码=`原码除最高位以外,按位取反`再+1或者`负数对应绝对值的原码全部按位取反`再+1
    
    • 1
    • 2
    • 3

    你可以根据上面两种方法的任意一个,推出负数的补码,但是在这里想反着推回去的时候,第一种会出现错误。
    两种方法最后都加一了,因此1,0000000-1肯定是没问题的,得到0,1111111
    第一种方法:原码除最高位以外,按位取反
    得到:00000000,是零
    如果127+1就等于了零,这个编码形式的覆盖范围是不是有些小了?因此这种结果我认为是错误的 。

    第二种方法:负数对应绝对值的原码全部按位取反
    全部按位取反:1,000 0000
    什么数的绝对值是128,-128

    所以127+1才能得到-128

    记得推导的时候不要使用第一种方法,求补码的时候两种方法都可以。
    
    • 1

    其实也有种负数的补码推回原码的技巧:
    寻找从右侧开始的第一个1,将其左侧除符号位以外的所有数据位 按位取反

    可以试试:

    -8的原码: 1000 1000
    -8的补码: 1111 1000
    
    • 1
    • 2

    至此,结束。

    如果你觉得这篇文章写的不错,多多点赞~收藏吧!

  • 相关阅读:
    楼房销售系统
    Java Object类简介说明
    Java学习笔记3.10.1异常处理 - 异常类型
    获得1688商品详情 API 返回值说明
    Kettle入门教程
    linux上mysql 8.0安装
    【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
    测试环境自动构建
    递归常用的三种枚举方式
    WPF-页面-DataGrid数据处理-多线程-Winform嵌入
  • 原文地址:https://blog.csdn.net/Aer_7z/article/details/132721866