【发布时间】:2021-10-05 12:25:34
【问题描述】:
假设我们有 3 位可以玩。我将用 2 的补码表示正负 3:
+3 = 0b011
-3 = 0b101
在进行加法时,当像这样(-3) + (+3):
1 0 1
+ 0 1 1
-----
1 0 0 0
但是减法(-3) - (+3)呢?
1 0 1
- 0 1 1
-----
0 1 0
0b010 是 2,这不是我们预期的正确结果 -6。有溢出
并且额外的位甚至没有生成,那么如何检测到有溢出?
我想解决这个问题的正确方法是先签署扩展输入?
【问题讨论】:
-
3 位 2 的补码只能处理 -4 .. +3 范围内的值,所以
-6换行到+2。 “期望”一个不可编码的值是没有意义的,但我认为这只是笨拙的措辞来谈论正确的数学结果。当输入符号相反且输出符号与第一个操作数不同时,您可以检测到减法溢出。 -
可以肯定地说,在进行有符号算术时,我们总是必须先将输入扩展为结果类型?
-
在 8 位字节中存储 3 位数字可以通过多种方式完成:忽略高 5 位,符号扩展 3 到 8,或将 3 位数字移到上端,以便将被忽略的 5 位是低 5 位。如果你选择第一种方式,你会失去处理器的一些特性,比如溢出标志和符号标志,但是还有其他方法可以获取这些信息。
-
@ErikEidt 有道理。我想这不是一个规则,这取决于是否要使用高位(加宽)位。
-
@ErikEidt 您提到的也可以应用于各种尺寸,即 8->32、8->64 等。
标签: assembly cpu-architecture twos-complement integer-arithmetic