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 - 最终计算机用补码表示数值:
减法化加法 符号位参与计算 电路统一 设计简单