xyz*_*xyz 7 hardware math cpu subtraction alu
我有一些基本的疑惑,但每次我坐下来试试面试问题时,这些问题和我的怀疑都会出现.
说A = 5
B = -2
我说A + B. 我假设A和B是4字节CPU怎么做这个添加?我知道A的符号位(MSB)为0表示正整数,B的符号位为1表示负整数.
现在在C++程序中,我想打印A + B,ALU(算术逻辑单元)的加法模块首先检查符号位然后决定进行减法然后按照减法程序进行.如何进行减法将是我的下一个问题.
A = 5
B = 2
想要做AB计算机将需要2秒补充B并添加A + 2s补充并返回此(丢弃左侧的额外位)?
A = 2
B = 5
做AB在这种情况下,计算机是如何做的?
我知道任何if-then等类型的条件逻辑都将在ALU内部的硬件中完成.计算2s补码等,丢弃额外的位将全部在ALU内部的硬件中完成.ALU的这个组件是什么样的?
谢谢,
你在符号位部分有点不对劲.它不仅仅是一个符号位 - 每个负数都转换为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个单独的程序.
考虑两位或三位,然后理解这些东西可以扩展到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.
乘法是另一个故事,二进制使乘法比使用十进制数学更容易,但你必须有不同的无符号和有符号乘法指令.分裂是它自己独立的野兽,这就是为什么大多数指令集没有分歧.由于它燃烧的门或时钟的数量,许多人没有倍增.
\n\n\nALU(算术逻辑单元)的加法模块是先检查符号位,然后决定做减法,然后执行减法的过程
\n
不,在补码和补码中,加/减正数或负数之间没有区别。对于正值和负值的任意组合,ALU 的工作原理都是相同的
\n\n所以 ALU 基本上是在做A + (-B)for A - B,但它不需要单独的求反步骤。设计人员使用巧妙的技巧,addsub通过仅添加复用器和非门以及新输入Binvert来使加法器在相同的周期长度内执行这两项操作,以便有条件地反转第二个输入。这是一个简单的 ALU 示例,可以执行 AND/OR/ADD/SUB
真正的加法器只是一个在 \xe2\x8a\x9e 内带有加号的盒子,它将a与b或~b相加并进位,产生总和并执行。它的工作原理是认识到在二进制补码 中-b = ~b + 1,所以a - b = a + ~b + 1。这意味着我们只需将进位设置为 1(或对借入取反)并反转第二个输入(即b)。这种类型的 ALU 可以在各种计算机体系结构书籍中找到,例如
在补码中,-b = ~b所以当你想减法时不要设置进位,否则设计是一样的。然而,二进制补码还有另一个优点:对有符号和无符号值的操作也以相同的方式工作,因此您甚至不需要区分有符号和无符号类型。对于补码,如果类型有符号,则需要将进位位添加回最低有效位
通过对上述 ALU 进行一些简单的修改,它们现在可以执行 6 种不同的操作:ADD、SUB、SLT、AND、OR、NOR
\n\n\n\n\n\n多位运算是通过连接上面的多个单位 ALU 来完成的。实际上,ALU 能够执行更多操作,但它们的设计目的是为了节省空间,原理类似
\n