反码与补码
1. 原码(Sign-Magnitude)
-
定义:最高位为符号位(0正1负),其余位表示绝对值。
-
示例:
+5:
0000 0101
-5:
1000 0101
问题:
加减法需处理符号位,硬件复杂。
0有两种表示(
0000 0000
和1000 0000
)。
2. 反码(Ones' Complement)
-
定义:
-
正数与原码相同。
-
负数:符号位不变,数值位按位取反。
-
-
示例:
-
+5:
0000 0101
-
-5:
1111 1010
-
-
运算:
-
减法可转为加法,但需处理循环进位(最高位进位加到最低位)。
-
例如:
5 + (-3)
:
-
0000 0101 (5)
+ 1111 1100 (-3的反码)
= 1 0000 0001 → 补上进位 → 0000 0010 (2)
-
问题:
- 0仍有两种表示(
0000 0000
和1111 1111
)。
- 0仍有两种表示(
3. 补码(Two's Complement)
-
定义:
-
正数与原码相同。
-
负数:反码加1(符号位参与运算)。
-
-
示例:
-
+5:
0000 0101
-
-5:
1111 1011
-
-
优势:
-
统一加减法:无需处理符号位,直接相加后舍弃溢出位。
-
唯一0表示:
0000 0000
。 -
扩展负数范围:n位补码可表示−2�−1−2n−1到2�−1−12n−1−1(如8位:-128~127)。
-
-
运算示例:
5 + (-3)
:
0000 0101 (5的补码)
+ 1111 1101 (-3的补码)
= 1 0000 0010 → 舍弃进位 → 0000 0010 (2)
4.为什么补码成为标准?
-
运算统一:加减法仅需加法器,简化电路。
-
0唯一性:避免歧义。
-
范围更大:多表示一个负数(如8位的-128)
5.快速求补码的方法
-
从右往左找到第一个
1
,保留该位及右侧所有位,左侧全部取反。 -
例如:求
-5
(8位):
- 原码:
0000 0101
- 反码:
1111 1010
- 补码:
1111 1011
(反码+1)