美文网首页
[Record] 二进制负数的表示与移位

[Record] 二进制负数的表示与移位

作者: simplehych | 来源:发表于2020-04-11 11:46 被阅读0次

    计算机在整数编码上采用 补码 的方式

    基于 8 位系统分析,以 正数1 和 负数 -1 为例

    示例 原码 反码 补码
    正数 1 0000 0001 0000 0001 0000 0001
    负数 -1 1000 0001 1111 1110 1111 1111

    最高位表示符号位:0 正数 / 1 负数

    正数:原码、反码、补码相同
    负数:原码最高位符号位,反码 在原码基础上除符号位外取反,补码 在反码的基础上+1

    求负数的补码
    十进制推二进制:该负数的绝对值,取反再+1

    以 -1 为例

    1. -1 的绝对值 1 -> 0000 0001
    2. 取反 +1 -> 1111 1110 + 1 = 1111 1111

    二进制推十进制:正数原码补码一样,负数取反+1,再添加正负。
    以 1111 1111 为例

    1. 高位是1 明确是负数
    2. 取反 + 1 -> 0000 0000 + 1 = 0000 0001
    3. 添加符号 1000 0001 = -1

    为什么计算机采用补码?而不采用有逻辑的原码?
    以计算 1+ (-1) 为例:
    原码计算: 0000 0001 + 1000 0001 = 1000 0010 = -2
    补码计算: 0000 0001 + 1111 1111 = 0000 0000 = 0 (最高位溢出,相当于丢弃),完美解决为题,故为了运算方便,舍弃了逻辑性。

    • 以 -128 为例
      最高位符号位
      127 原码 0111 1111
      -128 原码 无
      -128 反码 无
      -128 反码 1111 1111 (1111 1111(反码) + 1 = 1000 0000,这里实际上真正相加的是1111 1111后面的7位,第1位是符号位始终不会变,所以,当进到第8位的时候,溢出舍弃)

    扩展资料:

    byte类型的取值范围:有符号的[-128,127] 无符号的[0,255]

    对于有符号的数据类型来说:最高位为符号位 0 为正数,1为负数

    二进制数的补码

    1. 求二进制数的补数,目的是往计算机里面存放。

    2. 在计算机里面,存放的数字什么的,都称为机器码;那么二进制形式的补数,也就改称为补码了。

    3. 一般情况下,都是以 8 位二进制数来讨论补码,少数也有用 16 位数的。

    4. 计算时加上正数,是不需要进行求7a686964616fe78988e69d8331333366303830取补数的;只有进行减法(或者加上负数),才需要对减数求补数。

    5. 计算结果如果超出了-128~+127的范围,结果将是错误的,这是没有办法纠正的。

    6. 应用补码进行计算,完全符合前面介绍的“用补数可把减法转换成加法”的做法,只要忽略进位(这个进位1,就是求补的时候,加进去的1 0000 0000中的1),结果就是正确的。

    7. 求取补码,就按照定义的规定,负数采用“模减去绝对值”的方法来求,这是求补数的通用方法,适合于各种进制、各种大小的数字。

    8. 不要用求反加一的方法,也就不用理会原码和反码了,也不牵涉符号位的问题。

    相关文章

      网友评论

          本文标题:[Record] 二进制负数的表示与移位

          本文链接:https://www.haomeiwen.com/subject/mvzemhtx.html