0%

二进制数

二进制数的表示与运算:原码、反码、补码与移码

二进制是计算机存储和运算的基础,带符号的二进制数通过特定编码方式(原码、反码、补码、移码)处理正负值,其中补码是计算机底层实际采用的存储形式。以下从编码规则、表示范围到存储原理展开详细说明:

二进制数的符号表示与基本概念

符号位

  • 二进制数用最高位表示正负:0代表正数,1代表负数。
  • 例如:4 位二进制中,0011表示+31011表示-3(最高位1为符号位)。

真值与机器数

  • 真值:带符号位的二进制数对应的实际数值(如+3-3)。
  • 机器数:计算机中实际存储的带符号二进制数(如00111011)。

字长

  • 指计算机一次可处理的二进制位数(如 32 位、64 位),决定了数值的表示范围。

四种编码方式的规则与示例

设字长为n位(含 1 位符号位),以n=4为例(符号位 1 位,数值位 3 位):

原码

  • 规则:

    • 正数:符号位为0,数值位为真值的绝对值(如+30011)。
    • 负数:符号位为1,数值位为真值的绝对值(如-31011)。
  • 特殊值:

    • +0原码为0000-0原码为1000(存在两个 0 的表示)。
  • 示例:

    | 真值 | 原码 |
    | —— | —— |
    | +3 | 0011 |
    | -3 | 1011 |
    | +0 | 0000 |
    | -0 | 1000 |

反码

  • 规则:

    • 正数:反码与原码相同(如+30011)。
    • 负数:符号位不变,数值位按位取反0110)(如-3原码1011→反码1100)。
  • 特殊值:

    • +0反码为0000-0反码为1111(仍有两个 0)。
  • 示例:

    | 真值 | 反码 |
    | —— | —— |
    | +3 | 0011 |
    | -3 | 1100 |
    | +0 | 0000 |
    | -0 | 1111 |

补码(计算机实际存储方式)

  • 规则:

    • 正数:补码与原码、反码相同(如+30011)。
    • 负数:补码 = 反码 + 1(符号位不变,数值位计算时进位忽略符号位)(如-3反码1100→补码1101)。
  • 特殊值:

    • +0-0的补码统一为0000(解决了 0 的二义性)。
    • 字长为n时,最小负数补码为100...0(如 4 位中1000表示-8)。
  • 示例:

    | 真值 | 补码 |
    | —— | ——————— |
    | +3 | 0011 |
    | -3 | 1101 |
    | 0 | 0000 |
    | -8 | 1000(n=4 时) |

移码

  • 规则:

    • 移码 = 补码的符号位取反(如+3补码0011→移码1011-3补码1101→移码0101)。
  • 用途:常用于表示浮点数的阶码(指数),便于比较大小(移码的数值大小与真值一致)。

  • 示例:

    | 真值 | 补码 | 移码 |
    | —— | —— | —— |
    | +3 | 0011 | 1011 |
    | -3 | 1101 | 0101 |
    | 0 | 0000 | 1000 |

不同编码的表示范围(字长 n 位)

码制 定点整数范围 定点小数范围 可表示的数码个数
原码 (-(2^{n-1}-1) ~ +(2^{n-1}-1)) (-(1-2^{-(n-1)}) ~ +(1-2^{-(n-1)})) (2^n - 1)
反码 (-(2^{n-1}-1) ~ +(2^{n-1}-1)) (-(1-2^{-(n-1)}) ~ +(1-2^{-(n-1)})) (2^n - 1)
补码 (-2^{n-1} ~ +(2^{n-1}-1)) (-1 ~ +(1-2^{-(n-1)})) (2^n)
移码 (-2^{n-1} ~ +(2^{n-1}-1)) (-1 ~ +(1-2^{-(n-1)})) (2^n)
  • 关键差异:补码和移码比原码、反码多表示一个最小负数(如 4 位补码可表示-8,原码 / 反码最大负数为-7)。

计算机采用补码存储的原因

  1. 统一 0 的表示: 原码和反码中+0-0并存(如 4 位原码00001000),补码中0只有一种表示(0000),节省存储空间。

  2. 简化加减法运算: 补码将减法转换为加法(a - b = a + (-b)的补码),无需单独设计减法电路,硬件实现更简单。

    • 示例:计算

      1
      3 - 2 = 1
      • 转为补码加法:3补码0011 + (-2)补码1110 = 0001(补码)→ 真值1,结果正确。
  3. 符号位参与运算: 补码的符号位可直接参与加法运算,无需额外处理,简化运算逻辑

欢迎关注我的其它发布渠道