首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加法器如何执行无符号整数减法?

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

Stack Overflow用户
提问于 2011-11-08 23:42:36
回答 4查看 7.1K关注 0票数 5

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

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

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

代码语言:javascript
运行
复制
7-3=0111-0011=0111+1101=(1)0100

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-09 16:12:10

this answer中,对于一个相关的问题,有一个用C编写的示例代码,它展示了如何通过加法进行减法。该代码还设置进位和溢出标志,并包含一个简单的“测试”,该测试对一些数字进行加减运算,并打印结果。这些数字是8位的。

EDIT:正式证明,对于无符号整数,可以使用ADD而不是SUB。发现无符号溢出/下溢,就好像来自SUB一样。

假设我们想要计算a - b,其中ab是4位无符号整数,我们想要通过加法执行减法,并在a < b时得到4位差和下溢/溢出指示。

A-b=a+ (-b)

因为我们使用的是模16运算,所以-b = 16-b。所以,

A-b=a+ (-b) =a+ (16 - b)

如果我们执行a16-b的常规无符号加法,这个加法的溢出条件将是这样的(回想一下,我们正在处理的是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的条件。如果不等式不成立,我们得到进位= 0。

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

好的,a >= ba < b正好相反。

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-11-09 00:20:30

你的分析不正确。实际上,它依赖于CPU ALU单元。:)

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

在一般的二进制算术运算中,对于有符号整数和无符号整数,加上sub是相同的。只有受影响的标志是不同的。

实际上你必须考虑:

在有符号整数算术上,

  • 携带Overflow标志。在无符号整数算术上,

H117仅携带E219标志。H220F221

详细说明:

补码函数的挖掘是否定的,所以从正到正,从负到正,都是相反的负数。我们可以通过两种方式实现二进制补码。让我们看看3号的两种情况。

无符号算术时的进位

  • 是compl (3) = b'0011‘xor b'1111’+ b'0001‘= b'1101’+进位 (Carry仅在compl (0)处进位是set )

  • 在有符号算术数处是compl (3) = b'10000‘- b'0011’= b'1101‘等于b'0000’- b'0011‘= b'1101’+进位E233(进位仅在compl(0)上才是E134清除E235)H236<代码>G237

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

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

票数 5
EN

Stack Overflow用户

发布于 2011-11-08 23:50:08

这有点难理解但是..。我在做这个的时候用了一些VHDL。我有一个CPU,它的内存位置是无符号的,而偏移值是有符号的。

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8053053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档