6

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

例如,在 4 位二进制系统中,对于有符号整数,我们有 7-3=0111-0011=0111+1101=(1)0100,括号中的 1 是进位位。根据有符号整数的溢出规则,我们知道没有溢出,因此结果是正确的。

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

7-3=0111-0011=0111+1101=(1)0100

然后,根据无符号整数的溢出规则,由于进位,存在溢出。换句话说,0100是错误的,因为存在溢出。但事实上,我们知道结果0100是正确的。

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

4

4 回答 4

5

你的分析不正确。实际上取决于 CPU ALU 单元。:)

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

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

实际上你必须考虑:

  • 在有符号整数算术位、溢出标志处。
  • 在无符号整数算术仅位标志。

详细解释:

补函数的挖掘是取反,所以从正数中得到相反的负数,从负数中得到正数。我们可以通过两种方式进行二进制补码。让我们看看 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))

在第一种情况下,函数补码也对进位位进行补码,我们还有对进位标志的第二种解释,名为位。

在第二种情况下,一切都很清楚。如果我们在补码处有进位(溢出),则意味着我们需要另一个溢出来规范减法的结果。

于 2011-11-08T16:20:29.637 回答
4

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

编辑:正式证明可以使用 ADD 而不是 SUB 来处理无符号整数并像从 SUB 一样发现无符号上溢/下溢。

假设我们要计算a - b, whereab是 4 位无符号整数,我们希望通过加法执行减法并在a < b时获得 4 位差和下溢/上溢指示。

a - b = a + (-b)
因为我们在模 16 算术中操作,所以-b= 16-b。所以,
a - b = a + (-b) = a + (16 - b)

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

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

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

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

好吧,a >= b与a < b完全相反。

由此可以得出carry,您从加法中获得的标志a是减法溢出的倒数(16)-b,或者换句话说,是您通过使用适当的减法指令(例如 SUB)直接减去而获得的标志的倒数。borrowba

只需反转进位或以相反的方式处理它。

于 2011-11-09T08:12:10.273 回答
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;
于 2011-11-08T15:50:07.720 回答
0

你的分析是正确的。

采用

溢出 = EXOR(执行,添加'/SUB)

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

在无符号加法中,溢出表示为

执行 = 1

正确的结果由

执行 = 0

添加'/SUB = 0

用于添加

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

相似地

在无符号减法中,溢出表示为

执行 = 0

正确的结果由

执行 = 1

添加'/SUB = 1

用于减法

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

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

于 2019-07-16T15:53:28.440 回答