在计算机系统中,表示正数是相对简单的,只需使用其对应的二进制形式即可。然而,如何有效地表示负数一直是计算机科学中的一个关键问题。为了解决这个问题,科学家们提出了多种表示方法,包括 符号-大小表示法(Sign-Magnitude Representation)、一补码(One’s Complement) 和 二补码(Two’s Complement)。在本文中,我们将深入探讨这些表示方法的原理和运算机制,特别是详细解释 进位回补(Carry Back) 机制,以及如何利用加法器实现减法运算。最终,我们将了解为什么 二补码 成为现代计算机系统中广泛使用的负数表示方法。
符号-大小表示法是一种最直接的数值表示方法,它使用二进制数的最高位(最左边的位)表示符号,其余位表示数值的大小。
0
表示正数。1
表示负数。假设我们使用 8位 二进制数来表示整数:
+5 的表示:
0
(表示正数)0000101
(表示数字 5)00000101
-5 的表示:
1
(表示负数)0000101
(表示数字 5)10000101
在符号-大小表示法中,执行加减法运算需要对符号位和大小位分别处理。⚙️
同号相加:
+5 + (+3)
,计算 00000101 + 00000011 = 00001000
(+8)异号相加:
+5 + (-3)
,计算 00000101 - 00000011 = 00000010
(+2)✖️➕同号相减:
+5 - (+3)
,计算 00000101 - 00000011 = 00000010
(+2)异号相减:
+5 - (-3)
,计算 00000101 + 00000011 = 00001000
(+8)两个零的问题(Two Zeros Problem):
00000000
10000000
运算复杂性:
符号-大小表示法虽然直观,但由于存在两个零的问题和运算复杂性,在实际计算机系统中并不实用。
一补码通过对正数的二进制表示进行逐位取反(即将 0
变为 1
,1
变为 0
)来表示负数。
使用 8位 二进制数:
+5:
00000101
-5 的一补码:
+5
的二进制表示逐位取反:
00000101
取反为 11111010
一补码允许使用二进制加法器直接进行加减运算,但需要注意 进位回补(End-Around Carry)。⏳
计算 +5
和 -5
的和:
+5
:00000101
-5
:11111010
00000101 + 11111010 = 11111111
-0
(一补码中的负零)⚖️处理进位回补:
+7
和 -3
:
+7
:00000111
-3
:11111100
00000111 + 11111100 = 00000011
(无进位)00000011
,即 +3
减法可以转换为加法:
A - B
等价于 A + (-B)
00000000
11111111
一补码改进了符号-大小表示法,但仍有两个零的问题。进位回补机制增加了运算的复杂性。⚙️
二补码通过对正数的二进制表示逐位取反,然后加 1
来表示负数。✨
1
。使用 8位 二进制数:
+5:
00000101
-5 的二补码:
00000101
取反为 11111010
11111010 + 1 = 11111011
二补码的最大优势是可以直接使用二进制加法器进行加减运算,无需额外处理。
计算 +5
和 -5
的和:
+5
:00000101
-5
:11111011
00000101 + 11111011 = 00000000
(结果为 0
)计算 +7
和 -3
:
+7
:00000111
-3
:11111101
00000111 + 11111101 = 00000100
(结果为 +4
)✅A - B
等价于 A + (-B)
00000000
+127 + (+1)
(8位二进制):
+127
:01111111
+1
:00000001
01111111 + 00000001 = 10000000
(结果为 -128
,发生溢出)统一的运算机制:
只有一个零:
无需处理进位回补:
溢出检测简单:
在一补码中,进行加法运算时,如果产生了最高位的进位,需要将该进位加回到结果的最低位,这就是 进位回补(End-Around Carry)。♻️
计算 +5
和 -2
的和:
表示形式:
+5
:00000101
-2
的一补码:11111101
(00000010
取反)相加:
00000101 + 11111101 = 00000010
(结果为 +2
)再看另一个例子,计算 +5
和 -5
的和:
表示形式:
+5
:00000101
-5
的一补码:11111010
相加:
00000101 + 11111010 = 11111111
(结果为 -0
)进位回补:
1
,需要加回到最低位。在符号-大小表示法和一补码中,减法运算需要特殊处理:
判断符号位:
处理符号位:
在二补码中,减法运算可以完全转换为加法运算,无需特殊处理。
A - B
等价于 A + (-B)
计算 +7 - (+3)
:
表示形式:
+7
:00000111
+3
:00000011
计算 -B
的二补码:
+3
的二补码(求负):11111101
(00000011
取反加 1
)相加:
00000111 + 11111101 = 00000100
(结果为 +4
)方法 | 表示方式 | 零的数量 | 运算复杂度 | 优点 | 缺点 |
---|---|---|---|---|---|
符号-大小表示法 | 符号位表示正负,大小位表示数值 | 2 | 高 | 简单、直观 | 有两个零,加减运算复杂 |
一补码 | 正数正常,负数为正数逐位取反 | 2 | 中 | 负数表示简单 | 有两个零,需处理进位回补 |
二补码 | 正数正常,负数为正数逐位取反后加 1 |
1 | 低 | 运算简单统一 | 无明显缺点,现代广泛使用 |
本文深入探讨了 符号-大小表示法、一补码 和 二补码 这三种表示负数的方法。从最初直观但存在运算复杂性的符号-大小表示法,到引入进位回补机制的一补码,再到最终简化运算并广泛应用的二补码,我们可以看到计算机科学家们为解决负数表示和运算问题所做的努力。
二补码 的出现,不仅解决了两个零的问题,还使得加减法运算可以统一使用二进制加法器,大大简化了硬件设计和计算逻辑。这种方法的优势使其成为现代计算机系统中表示和运算有符号整数的标准方式。
理解这些概念,不仅有助于我们深入认识计算机的底层工作原理,也为进一步学习计算机体系结构和数字电路奠定了坚实的基础。