加法器如何执行无符号整数减法?

时间:2011-11-08 15:42:36

标签: assembly unsigned subtraction

假设AB是有符号正整数,那么对于A-B,它是使用A+2的{​​{1}}补码计算的。

例如,在4位二进制系统中,对于有符号整数,我们有 B, 括号中的1是进位。根据有符号整数的溢出规则,我们知道没有溢出,因此结果是正确的。

但是,对于无符号整数,如果我们计算7-3=0111-0011=0111+1101=(1)0100会发生什么?如果我们使用上面提到的相同方式:

7-3

然后,根据无符号整数的溢出规则,由于执行而存在溢出。换句话说,7-3=0111-0011=0111+1101=(1)0100 是错误的,因为存在溢出。但事实上,我们知道结果0100是正确的。

如果我的分析是正确的,使用加法器执行无符号整数减法是不是错了?

4 个答案:

答案 0 :(得分:4)

您的分析不正确。实际上是CPU ALU单元依赖。 :)

在第一种情况下,您使用的是4位整数,但您忘记了4位符号整数的最高位是符号!因此,您只检查进位和溢出状态,而不是否定状态位。

通常二进制算术运算 add sub 对于有符号整数和无符号整数是相同的。只有受影响的标志不同。

实际上你必须考虑:

  • 有符号整数算术进位溢出否定标记。
  • 仅在无符号整数运算进位标志。

详细说明:

补充函数的挖掘是否定的,所以从正面得到相反的负数而从负面得到正面。我们可以通过两种方式进行二进制补码。让我们看看这两个案例都是3号。

  1. 无符号算术是compl(3)= b'0011'xor b'1111'+ b'0001'= b'1101'+ 携带(仅在compl(0)时进行设置
  2. 在签名的算术数字是符合(3)= b'10000' - b'0011'= b'1101'什么 是等于b'0000' - b'0011'= b'1101'+ 携带(携带清除仅限于 compl(0))
  3. 在第一种情况下,函数补码也补充了进位,我们还对进位标志borrow进行了第二种解释。

    在第二种情况下,一切都很清楚。如果我们在补集处得到进位(溢出)意味着我们需要另一个溢出来归一化减法的结果。

答案 1 :(得分:1)

this answer的相关问题中,C中的示例代码显示了如何通过加法进行减法。代码也设置了进位和溢出标志,并包含一个简单的“测试”,可以添加和减去一些数字并打印结果。这些数字是8位。

编辑:正确证明可以使用ADD而不是SUB来表示无符号整数 AND 发现无符号溢出/下溢,就好像来自SUB。

假设我们要计算a - b,其中ab是4位无符号整数,我们希望通过加法执行减法并获得4位差异和 a<下溢/溢出指示B'/强>

a - b = a +( - b)
由于我们使用模16运算,-b = 16-b。所以,
a - b = a +( - b)= a +(16 - b)

如果我们执行a16-b的常规无符号加法,则此加法的溢出条件(通常由CPU在其carry标志中指示)将是这样的(回想一下我们正在处理4位整数):

a +(16-b)> 15个
让我们简化这种溢出情况:
a + 16 - b> 15个
a + 16> 15 + b
a + 1> b
a> b - 1

现在让我们回想一下,我们正在处理整数。因此,上述内容可以改写为:
a> = b
这是在添加a(16)-b后获取进位标志= 1的条件。如果不等式不成立,我们得到carry = 0。

现在让我们回想一下,我们对减法(a-b)的溢出/下溢感兴趣。该条件是 a< B'/强>

嗯, a> = b a<完全相反B'/强>

由此可见,添加carrya后得到的(16)-b标志是减法溢出的倒数,换句话说,逆通过使用适当的减法指令(例如SUB)直接从borrow减去b来获得a标记

只需颠倒携带物或以相反的方式处理它。

答案 2 :(得分:0)

这有点难以理解但是...我有一些VHDL,我这样做。我的CPU有一个无符号的内存位置和一个已签名的偏移值。

architecture Behavioral of adder16 is
signal temp: std_logic_vector (16 downto 0);
begin
eval: process(vectA,vectB,temp)
begin
temp <=(('0'& vectB)  + (vectA(15) & vectA));
output <= temp( 15 downto 0);
end process;
end Behavioral;

答案 3 :(得分:0)

您的分析是正确的。

使用

  

溢流= EXOR(进位,ADD'/ SUB)

为单解释确定无符号加法和无符号减法(使用2的补数加法)的溢出。

在无符号加法中,溢出由

指示
  

携带= 1

正确的结果由

表示
  

携带= 0

但是

  

ADD'/ SUB = 0

用于添加

所以无论如何溢出都由1表示。

类似地

在无符号减法中,溢出由

表示
  

携带= 0

正确的结果由

表示
  

携带= 1

但是

  

ADD'/ SUB = 1

用于减法

所以无论如何溢出都由1表示。

因此,我们可以对无符号加法和无符号减法中的溢出有单一解释。