我有一些基本的疑虑,但每次我坐下来尝试面试时,都会出现这些问题和疑点。
说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
。计算机将取2的B补码并加上A + 2的B补码并返回(丢弃左边的额外位)?
A = 2
B = 5
做A - B
。在这种情况下,计算机如何做?
我知道任何if-then等类型的条件逻辑都将在ALU内的硬件中完成。计算2s补码等,丢弃额外的位将全部在ALU内部的硬件中完成。 ALU的这个组件是什么样的?
答案 0 :(得分:13)
我们使用2's-complement的全部原因是,无论数字是正数还是负数,添加都是相同的 - 没有特殊情况需要考虑,例如1's-complement或signed-magnitude表示。
所以要找到A-B
,我们可以否定B并添加;也就是说,我们找到A + (-B)
,因为我们使用二进制补码,我们不担心(-B)
是正还是负,因为加法算法的工作方式相同。
答案 1 :(得分:7)
符号位部分有点不对劲。它不仅仅是一个符号位 - 每个负数都转换为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个单独的程序。
答案 2 :(得分:7)
用两位或三位思考,然后理解这些东西可以扩展到32位或64位或多位。
首先,让我们从十进制开始
99
+22
===
为了做到这一点,我们将会有一些“随身携带”。
11
99
+22
===
121
9加2是1携带一个,1加9加2是2携带一个...
关键是要注意添加两个数字我实际上需要三行,至少其中一些我可能需要添加三个数字。与alu中的加法器相同,每个列或位通道,单位加法器,需要能够添加两个输入和一个进位,输出是一位结果和一位进位。
由于您使用了5和2,因此可以进行一些4位二进制数学
0101
+0010
=====
0111
我们不需要携带这个,但你可以看到数学有效,5 + 2 = 7.
如果我们想加5和-2
11
0101
+1110
=====
0011
答案是预期的3,不是很令人惊讶,但我们有一个执行。而且因为这是一个带有减号的二进制补码,所有工作都有效,那么就没有符号位,二进制补码使得我们不关心只是给加法器提供两个操作数。
现在,如果你想做一个微妙的区别,如果你想从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。
乘法是另一个故事,二进制使乘法比使用十进制数学更容易,但你必须有不同的无符号和有符号乘法指令。分裂是它自己独立的野兽,这就是为什么大多数指令集没有分歧。由于它燃烧的门或时钟的数量,许多人没有倍增。
答案 3 :(得分:1)
以二进制补码表示:不是B = -B -1或-B =(不是B)+ 1.可以在计算机上或纸上查看。
所以A - B = A +(非B)+ 1可以用以下方式执行:
1按位不
1增量
1次添加
使用nots和negations进行低效递增和递减是一种技巧。 例如,如果您从寄存器中的数字0开始并执行:
not,neg,not,neg,not,neg,...寄存器将具有值:
-1,1,-2,2,-3,3,......
或另外两个公式:
不是(-A)= A - 1
- (不是A)= A + 1
答案 4 :(得分:0)
先做算术逻辑单元(ALU)的加法模块,检查符号位,然后决定进行减法,然后遵循减法步骤
不,在一个或两个的补码中,加/减正数或负数之间没有区别。正负值的任何组合都可以使用ALU。
因此,ALU基本上为A + (-B)
做了A - B
,但不需要单独的取反步骤。 设计人员使用巧妙的技巧使加法器在相同的周期长度内同时执行add
和sub
,只需在新的循环中添加muxer和NOT门即可输入 Binvert 以便有条件地反转第二个输入。这是一个可以执行AND / OR / ADD / SUB
Computer Architecture - Full Adder
真正的加法器只是一个在inside内带有加号的框,该框将 a 与 b 或〜b 和携带in ,生成 sum 和执行。它通过实现二进制补码-b = ~b + 1
(即a - b = a + ~b + 1
)来工作。这意味着我们只需要将进位设置为1(或取消进位借位)并反转第二输入(即 b >)。这种ALU可以在各种计算机体系结构书籍中找到,例如
以一个补语-b = ~b
为单位,因此当您要减去时,不必设置进位,否则设计是相同的。但是,二进制补码的另一个优点是:对有符号和无符号值进行的操作也相同,因此您甚至不需要区分有符号和无符号类型。对于某人的补语,您需要add the carry bit back to the least significant bit(如果该类型已签名)
通过对上述ALU进行一些简单的修改,它们现在可以执行6种不同的操作:ADD,SUB,SLT,AND,OR,NOR
CSE 675.02: Introduction to Computer Architecture
多位操作是通过串联以上多个单位ALU来完成的。实际上,ALU可以执行更多的操作,但是它们是按照相似的原理来节省空间的