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

计算机在整数编码上采用 补码 的方式
基于 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为负数
[Record]|[Record] 二进制负数的表示与移位
文章图片
二进制数的补码
  1. 求二进制数的补数,目的是往计算机里面存放。
  2. 在计算机里面,存放的数字什么的,都称为机器码;那么二进制形式的补数,也就改称为补码了。
  3. 一般情况下,都是以 8 位二进制数来讨论补码,少数也有用 16 位数的。
  4. 计算时加上正数,是不需要进行求7a686964616fe78988e69d8331333366303830取补数的;只有进行减法(或者加上负数),才需要对减数求补数。
  5. 【[Record]|[Record] 二进制负数的表示与移位】计算结果如果超出了-128~+127的范围,结果将是错误的,这是没有办法纠正的。
  6. 应用补码进行计算,完全符合前面介绍的“用补数可把减法转换成加法”的做法,只要忽略进位(这个进位1,就是求补的时候,加进去的1 0000 0000中的1),结果就是正确的。
  7. 求取补码,就按照定义的规定,负数采用“模减去绝对值”的方法来求,这是求补数的通用方法,适合于各种进制、各种大小的数字。
  8. 不要用求反加一的方法,也就不用理会原码和反码了,也不牵涉符号位的问题。

    推荐阅读