• 反码符号128有8位二进制表示的原码、反码和补码


    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--反码符号

        一、模的概念(我只罗列一个例子,具体请查数学中的 "同余模")
           在日常生活中,有很多化减为加的例子。例如,时钟是逢12进位,12点也可看做0点。
           当将时针从 10点 调整到 5点 时有以下两种方法:
           <1> 将时针逆时针方向拨5格,相当于做减法:10 - 5 = 5
           <2> 将时针顺时针方向拨7格,相当于做加法:10 + ( 12 - 5 ) = 12 + 5 = 5    (模为 12)

        二、模的运用(采取模失掉补码)
           1、
    补码的得来:是为了让正数酿成可以加的正数。so,正数的补码 = 模 - 正数的绝对值
                 如:-1 补码:1111 1111(1 0000 0000  - 1得来)
                 当一个数要减 1 的时候,可以直接加 1111 1111
           2、原码的得来:正数的原码,直接把对应正数的最高位改成1
                 原码可以直观的表示一个正数(能直观的把真值显示出来,如 -1 为 1000 0001,其中最高位表示符号位,不进行算术计算)
           3、总结:补码相加,到第9位才舍弃(模10000 0000)
                             原码相加,到第8位舍弃(模1000 0000)
                             反码相加,到第8位舍弃(模1000 0000)
           4、原码和补码之间转换:
           ( 1 ) 补码 = 原码 - 1,再取反 (便于理解)

                   或 补码 =  反码 + 1 (便于描述和推理)
           ( 2 ) 演示:补码=原码减1,再取反
                  如:-1 的原码 1000 0001 => 1000 0000(减1后) => 1111 1111(取反后)补码
           ( 3 ) 演示:补码= 反码+1
                  如:-1 的原码  1000 0001 => 1111 1110(反码) => 1111 1111(加1)补码     
           ( 4 ) 重点:(特别是在有进位的时候)
                  原码和反码的最高位是符号位,不参加算术运算,模为1000 0000(比补码少一个0)
                  而补码所有位都可以相加,模为1 0000 0000(最高位不是符号位,补码是通过 模 减去 正数绝对值 失掉的)
    三、揣摸 -128 的原码和补码(用 补码 =  反码 + 1)

        每日一道理
    喜马拉雅直冲霄汉,可上面有攀爬者的旗帜;撒哈拉沙漠一望无垠,可里面有跋涉者的脚印;阿尔卑斯山壁立千仞,可其中有探险者的身影;雅鲁藏布江湍急浩荡,可其中有勇敢者的故事。

               1、关于原码 1000 0000,表示的是 -0,还是 -128 呢?(谜底是 -128 而不是 -0 )
                 先看看原码的概念吧:正数的符号位为 0,正数的符号位为 1,其它位按照一般的方法来表示数的绝对值
                 0 是正数吗?0 既不是正数也不是正数,那么它的符号位究竟是 0 还是 1 呢?(0 的符号位为 0,不能为 1)
                 看看正数补码的公式:正数的补码 = 1 0000 0000(模)  -  数的绝对值
                 比如:-1   1111 1111 = 1 0000 0000 - 0000 0001
                             -2   1111 1110 = 1 0000 0000 - 0000 0010
                 当初假设 -0 为正数,那么
                 -0 的 补码应该是1 0000 0000 - 0(这个 0,姑且叫 0 的绝对值吧) = 0000 0000
                           反码:1111 1111(0000 0000 - 1 = 0000 0000 + 1111 1111 = 1111 1111)
                           原码:1000 0000
                 当初来推-128
                 -128的 补码:1 0000 0000 - 1000 0000( +128 没有符号位) = 1000 0000
                               反码:1111 1111(1000 0000 -1 = 1000 0000 + 1111 1111 = 1111 1111) (补码-1)
                               原码:1000 0000(反码取反)
                 从上面看来,一个原码对应了2个补码
                 但是仔细分析:原码的概念,正数的符号位为 1,但是 0 不是正数,所以不能用此公式。0 也不是正数,但是可以把0定义为原码、反码和补码都一样(即 0000 0000),而且据说可以揣摸出 0 的补码只有一个(有兴致的 可以去推一下,呵呵)
                 当初原码 1000 0000 就唯一表示-128了,而不会表示出 -0,因为 -0 不能用这个公式计算。
                 当初,补码 1000 0000 的原码是 1000 0000 (已证明),那么原码 1000 0000 的补码是 1000 0000 吗?
                             原码 1000 0000  (-128,进位被舍去)
                             反码 1111 1111 
                             补码 1000 0000 (1111 1111(反码) + 1 = 1000 0000,这里实际上真正相加的是 1111 1111 后面的7位,第1位是符号位始终不会变,所以,当进到第8位的时候,溢出了,会被舍弃)
           2、综上所述:

               <1> -128的补码和原码一样都是 1000 0000,
           <2> 0的原码、反码和补码都一样(即 0000 0000 )
           <3> 如果把 -0 当做正数,1000 0000 就会有歧义(事实上 0 的补码只有一个 0000 0000 )

    文章结束给大家分享下程序员的一些笑话语录: 腾讯总舵主马化腾,有人曾经戏称如果在Z国选举总统,马化腾一定当选,因为只要QQ来一个弹窗”投马总,送Q币”即可。

    --------------------------------- 原创文章 By
    反码和符号
    ---------------------------------

  • 相关阅读:
    记一次GreenPlum性能调优
    PostgreSQL时间格式及相关函数实践
    OGG到OGGAdapter配置详情-从Oracle直接抽取成csv文件
    使yum保留下载的rpm包
    源码编译tmux
    抠图
    ps磨皮的方法
    谷歌学术网站镜像
    element菜单默认展开和选中
    git仓库如果是私密的,每台电脑上导下来都需要进行ssh授权,所以一个项目不知一个ssh权限
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3106936.html
Copyright © 2020-2023  润新知