数字表示-原码 反码 补码 移码

1. 计算规则

假设数字用8位编码
正数原 反 补码相同
原码 +25: 0 001 1001 最高位为符号位 后7位为真值部分
反码 +25: 0 001 1001 最高位为符号位 后7位为真值部分
补码 +25: 0 001 1001 最高位为符号位 后7位为真值部分

负数反码 = 符号位不变原码真值部分取反 负数补码 = 符号位不变反码+1
原码 -25: 1 001 1001 最高位为符号位 后7位为真值部分
反码 -25: 1 110 0110 最高位为符号位 后7位为原码真值取反
补码 -25: 1 110 0111 最高位为符号位 后7位为反码真值加一

特殊值
原码 +0: 0 000 0000 原码 -0: 1 000 0000
反码 +0: 0 000 0000 反码 -0: 1 111 1111
补码 +0: 0 000 0000 补码 -0: 0 000 0000 超出8位丢弃最高位

移码 = x + 偏移量 = 补码符号位取反 偏移量 = 2^(n-1) = 128
+25移码: 25 + 128 = 1001 1001
-25移码: -25 + 128 = 0110 0111
+0移码: 0 + 128 = 1000 0000
-0移码: -0 + 128 = 1000 0000

2. 解释

补码: 将减法转化为加法 正数不变 负数 = 模 - 绝对值
移码:加一个偏移量负数变为正数方便计算 浮点数阶码用移码表示 方便比较阶码大小
加法器实现加减功能: 减去一个正数等于加上一个正数

3. 原码 反码 补码的进化原因

  1. 原码->反码:只有原码不能正确计算
    原码计算 1 - 1 = 1 + (-1) = 0 000 0001 + 1 000 0001 = 1 000 0010 = -2 计算错误
    反码计算 1 - 1 = 1 + (-1) = 0 000 0001 + 1 111 1110 = 1 111 1111 = -0 真值正确但符号多余
  2. 反码->补码:只有反码有 -0 符号多余
    补码计算 1 - 1 = 1 + (-1) = 0 000 0001 + 1 111 1111 = 0 000 0000 = 0 没有-0
  3. 最终计算机用补码表示数值:减法化加法 符号位参与计算 电路统一 设计简单

参考链接

你可能感兴趣的:(计算机组成原理,csapp,补码)