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

2020-04-11  本文已影响0人  simplehych

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

基于 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 (最高位溢出,相当于丢弃),完美解决为题,故为了运算方便,舍弃了逻辑性。

扩展资料:

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. 不要用求反加一的方法,也就不用理会原码和反码了,也不牵涉符号位的问题。

上一篇 下一篇

猜你喜欢

热点阅读