7

我有一些基本的疑问,但每次我坐下来尝试面试问题时,这些问题和我的疑问都会冒出来。

假设 A = 5,B = -2。假设 A 和 B 都是 4 字节,那么 CPU 是怎么做A + B加法的呢?

我知道 A 的符号位 (MSB) 为 0 表示正值,B 的符号位为 1 表示负整数。

现在在C++程序中,我想打印A + B,ALU(算术逻辑单元)的加法模块是否首先检查符号位,然后决定做减法,然后按照减法的过程。如何进行减法将是我的下一个问题。

A = 5
B = 2

我想做A - B。计算机将取 B 的 2 的补码并添加 B 的 A + 2 的补码并返回(在丢弃左侧的额外位之后)?

A = 2
B = 5

A - B。在这种情况下,计算机是如何工作的?

我知道任何 if-then 等条件逻辑都将在 ALU 内部的硬件中完成。计算 2s 补码等,丢弃多余的位都将在 ALU 内部的硬件中完成。ALU 的这个组件是什么样子的?

4

5 回答 5

16

我们使用2's-complement的全部原因是,无论数字是正数还是负数,加法都是相同的 - 没有特殊情况需要考虑,例如1's-complement或有符号幅度表示。

所以要找到A-B,我们可以否定 B 并添加;也就是说,我们找到A + (-B),并且因为我们使用的是 2 的补码,所以我们不用担心它(-B)是正数还是负数,因为加法算法的工作原理都是一样的。

于 2011-04-26T17:15:19.700 回答
8

您在符号位部分有点错误。它不仅仅是一个符号位 - 每个负数都转换为 2 的补码。如果你写:

B = -2

编译器将其编译为二进制时将使其:

1111 1111 1111 1111 1111 1111 1111 1110

现在,当它想加 5 时,ALU 得到 2 个数字并将它们相加,这是一个简单的加法。

当 ALU 收到一个减去它的命令时,它会得到 2 个数字 - 它对第二个数字的每一位都做一个 NOT,然后做一个简单的加法并再加 1(因为 2 的补码不是每个位 +1)。

这里要记住的基本事项是,选择 2 的补码的目的正是为了不必为 2+3 和 2+(-3) 制作 2 个单独的过程。

于 2011-04-26T17:13:31.713 回答
8

考虑两个或三个位,然后了解这些东西可以扩展到 32 或 64 或许多位。

首先,让我们从十进制开始

 99
+22
===

为了做到这一点,我们将进行一些“随身携带”。

11
 99
+22
===
121

9加2是1进1,1加9加2是2进1……

重点是要注意要添加两个数字,我实际上需要三行,至少其中一些我可能需要能够添加三个数字。与 alu 中的加法器相同,每列或位通道,单个位加法器,需要能够将两个输入和一个进位相加,输出是一位结果和一位进位。

由于您使用了 5 和 2,让我们做一些 4 位二进制数学

 0101
+0010
=====
 0111

我们不需要继续这个,但你可以看到数学是有效的,5 + 2 = 7。

如果我们想添加 5 和 -2

11
 0101
+1110
=====
 0011

正如预期的那样,答案是 3,这并不奇怪,但我们有一个执行。而且由于这是一个带有负数的加法,所以它都可以工作,所以没有 if 符号位,所以我们不在乎只为加法器提供两个操作数。

现在如果你想做出细微的差别,如果你想从 5 中减去 2,你选择减法指令而不是加法。好吧,我们都知道,在二进制补码中取反意味着反转和加一。我们在上面看到,一个两输入加法器确实需要第三个输入来进行进位,以便它可以级联到加法器需要的宽度。因此,与其进行两次加法运算,不如将反转和加 1 作为第一个加法,真正的加法我们所要做的就是反转并设置进位:

了解没有减法逻辑,它会添加您提供的任何内容的负数。

    v this bit is normally zero, for a subtract we set this carry in bit
11 11
 0101 five
+1101 ones complement of 2
=====
 0011

你知道吗,我们得到了相同的答案……这两个操作数的实际值是什么并不重要。如果是加法运算,则在进位位上放置一个零并将其馈送到加法器。如果它是减法运算,则将第二个操作数取反并在进位上放一个并将其馈送到同一个加法器。掉出来的东西都会掉出来。如果您的逻辑有足够的位来保存结果,那么一切正常,如果您没有足够的空间,那么您就会溢出。

溢出有两种,无符号和有符号。无符号很简单,它是进位位。有符号溢出与比较 msbit 列上的进位位与该列的进位位有关。对于我们上面的数学,您会看到该 msbit 列的进位和进位是相同的,两者都是一个。我们碰巧通过检查知道 4 位系统有足够的空间来正确表示数字 +5、-2 和 +3。4 位系统可以表示 +7 到 -8 的数字。因此,如果您要添加 5 和 5 或 -6 和 -3,您将得到有符号溢出。

01 1
 0101
+0101
=====
 1010

了解 SAME 加法逻辑用于有符号和无符号数学,这取决于您的代码,而不是虚拟定义这些位是否被视为二进制补码有符号或无符号的逻辑。

对于上面的 5 + 5 情况,您会看到 msbit 列上的进位是 1,但进位是 0,这意味着 V 标志(有符号溢出标志)将由逻辑设置。同时,该位的进位,即 C 标志的进位标志,将不会被设置。当考虑无符号 4 位可以容纳数字 0 到 15 时,因此 5 + 5 = 10 不会溢出。但是当考虑有符号的 4 位可以容纳 +7 到 -8 并且 5 + 5 = 10 是有符号溢出时,因此设置了 V 标志。

如果/当您有带进位指令的加法时,它们采用相同的加法器电路,而不是将进位输入零,而是输入进位标志。同样,借位减法,根据状态寄存器中进位标志的状态,进位不是 1,而是进位是 1 或 0。

乘法完全是另一回事,二进制使乘法比使用十进制数学更容易,但你必须有不同的无符号和有符号乘法指令。除法是它自己独立的野兽,这就是为什么大多数指令集没有除法。由于它烧毁的门或时钟的数量,许多没有乘法。

于 2011-04-27T18:20:44.860 回答
3

ALU(算术逻辑单元)的加法模块是否首先检查符号位,然后决定进行减法,然后执行减法程序

不,在一个和两个的补码中,加/减正数或负数之间没有区别。对于正值和负值的任何组合,ALU 的工作方式相同

所以 ALU 基本上是在做A + (-B)for A - B,但它不需要单独的否定步骤。设计人员使用一个聪明的技巧来使加法器在相同的周期长度内完成这两项add工作,sub方法是只添加一个多路复用器和一个非门以及新的输入Binvert,以便有条件地反转第二个输入。这是一个简单的 ALU 示例,可以执行 AND/OR/ADD/SUB

全加器

计算机体系结构 - 全加器

真正的加法器只是一个在 ⊞ 内带有加号的框,它将ab~b相加并进,产生总和并进。它的工作原理是在二进制补码中实现-b = ~b + 1,所以a - b = a + ~b + 1。这意味着我们只需要将进位设置为 1(或对借入取反)并反转第二个输入(即b)。这种类型的 ALU 可以在各种计算机体系结构书籍中找到,例如

RISC-V ALU

在一个补码中,因此您在要减去时-b = ~b不要设置进位,否则设计是相同的。然而,二进制补码还有另一个优点:对有符号和无符号值的操作也同样有效,因此您甚至不需要区分有符号和无符号类型。对于一个人的补码,如果类型是有符号的,您需要将进位位添加回最低有效位

通过对上述 ALU 进行一些简单的简单修改,它们现在可以执行 6 种不同的操作:ADD、SUB、SLT、AND、OR、NOR

6 功能 ALU

CSE 675.02:计算机体系结构简介

多位运算是通过连接上面的多个单位 ALU 来完成的。实际上,ALU 能够做更多的操作,但它们是为了节省空间而设计的,原理相似

于 2019-05-23T16:32:30.993 回答
2

在 2 的补码表示法中:not B = -B -1-B = (not B) + 1. 可以在电脑上或纸上检查。

所以 A - B = A + (not B) + 1 可以这样执行:

  • 1 按位不
  • 1 个增量
  • 1 个添加

仅使用非和否定来低效地递增和递减是有技巧的。

例如,如果您从寄存器中的数字 0 开始并执行:

not, neg, not, neg, not, neg, ...寄存器将有值:

-1, 1, -2, 2, -3, 3, ...

或者作为另外两个公式:

not(-A) = A - 1
-(not A) = A + 1
于 2017-03-17T13:28:26.737 回答