Math CPU如何进行减法运算?

Math CPU如何进行减法运算?,math,cpu,hardware,subtraction,alu,Math,Cpu,Hardware,Subtraction,Alu,我有一些基本的疑问,但每次我坐下来试着回答面试问题时,这些问题和我的疑问就会出现 假设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的补码,加上A+2的B补码,然后返回这个(在丢弃左边多余的位之后)

我有一些基本的疑问,但每次我坐下来试着回答面试问题时,这些问题和我的疑问就会出现

假设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的补码,加上A+2的B补码,然后返回这个(在丢弃左边多余的位之后)

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


我知道任何if-then等条件逻辑都将在ALU内部的硬件中完成。计算2s补码等,丢弃额外的位都将在ALU内部的硬件中完成。ALU的这个组件看起来怎么样?

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

B = -2
编译器在将其编译为二进制时将使其:

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

当ALU得到一个减法命令时,它被赋予2个数字-它对第二个数字的每一位都做a,并进行简单的加法,再加1(因为2的补码不是对每一位+1)

基本上要记住的是,2的补码是为了不必为2+3和2+(-3)分别制定2个独立的程序而选择的。

< P>我们使用的全部原因是加法是相同的,不管数字是正的还是负的-没有特殊的情况要考虑,就好像有人在谈论或陈述


所以要找到A-B,我们可以把B取反,然后加上;也就是说,我们找到了A+(-B),因为我们使用的是2的补码,所以我们不担心
(-B)
是正数还是负数,因为加法算法的工作方式都是一样的。

从两位或三位的角度思考,然后理解这些东西可以扩展到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
你知道吗,我们得到的答案是一样的……这两个操作数的实际值都不重要。如果是加法运算,则在进位上加一个零,并将其输入加法器。如果是减法运算,则将第二个操作数反转,并将一个操作数放入进位运算,然后将其馈送到同一个加法器。出了什么就出什么。如果您的逻辑有足够的位来保存结果,那么它就可以正常工作,如果您没有足够的空间,那么您就会溢出

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

01 1
 0101
+0101
=====
 1010
要知道,相同的加法逻辑用于有符号和无符号数学,实际上要定义这些位是否被视为有符号或无符号的补位,这取决于您的代码,而不是逻辑

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

如果/当您有带进位的加法指令时,它们采用相同的加法器电路,而不是将进位输入零,而是输入进位标志。同样是减法
not(-A) = A - 1
-(not A) = A + 1