假设A
和B
是有符号正整数,那么对于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
是正确的。
如果我的分析是正确的,使用加法器执行无符号整数减法是不是错了?
答案 0 :(得分:4)
您的分析不正确。实际上是CPU ALU单元依赖。 :)
在第一种情况下,您使用的是4位整数,但您忘记了4位符号整数的最高位是符号!因此,您只检查进位和溢出状态,而不是否定状态位。
通常二进制算术运算 add 和 sub 对于有符号整数和无符号整数是相同的。只有受影响的标志不同。
实际上你必须考虑:
详细说明:
补充函数的挖掘是否定的,所以从正面得到相反的负数而从负面得到正面。我们可以通过两种方式进行二进制补码。让我们看看这两个案例都是3号。
在第一种情况下,函数补码也补充了进位,我们还对进位标志borrow进行了第二种解释。
在第二种情况下,一切都很清楚。如果我们在补集处得到进位(溢出)意味着我们需要另一个溢出来归一化减法的结果。
答案 1 :(得分:1)
在this answer的相关问题中,C中的示例代码显示了如何通过加法进行减法。代码也设置了进位和溢出标志,并包含一个简单的“测试”,可以添加和减去一些数字并打印结果。这些数字是8位。
编辑:正确证明可以使用ADD而不是SUB来表示无符号整数 AND 发现无符号溢出/下溢,就好像来自SUB。
假设我们要计算a - b
,其中a
和b
是4位无符号整数,我们希望通过加法执行减法并获得4位差异和 a<下溢/溢出指示B'/强>
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 。
这是在添加a
和(16)-b
后获取进位标志= 1的条件。如果不等式不成立,我们得到carry = 0。
现在让我们回想一下,我们对减法(a-b)的溢出/下溢感兴趣。该条件是 a< B'/强>
嗯, a> = b 与 a<完全相反B'/强>
由此可见,添加carry
和a
后得到的(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表示。
因此,我们可以对无符号加法和无符号减法中的溢出有单一解释。