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