9

我正在观看 David Malan(这里)关于二进制的一些精彩讲座。他谈到了有符号/无符号、1 的恭维和 2 的补码表示。有一个 4 + (-3) 的加法,排列如下:

0100
1101 (flip 0011 to 1100, then add "1" to the end)
----
0001

但他挥舞着神奇的双手,扔掉了最后一个进位。我做了一些维基百科研究,有点不太明白,有人可以向我解释为什么那个特定的进位(在 8's -> 16's 列中)被丢弃了,但他保留了它之前的那个吗?

谢谢!

4

10 回答 10

11

最后一个进位被丢弃,因为它不适合目标空间。这将是第五位。

如果他执行相同的加法,但使用例如 8 位存储,它会看起来像这样:

00000100
11111101
--------
00000001

在这种情况下,我们也会被“未使用”的进位卡住。

我们必须以这种方式处理进位,以使加法与二的赞美正常工作,但这一切都很好,因为当您的存储空间有限时,这是最简单的处理进位的方法。无论如何,我们得到了正确的结果,对吧:)


x86 处理器将这种额外的进位存储在进位标志 (CF) 中,可以使用某些指令进行测试。

于 2009-11-02T21:01:54.440 回答
4

进位与溢出不同

在示例中,您确实有一个 MSB 执行。根据定义,这种进位最终会在地板上。(如果它有什么地方可以去,那么它就不会离开 MSB。)

但是两个不同符号的数字相加不会溢出。只有当两个具有相同符号的数字产生具有不同符号的结果时,才会发生溢出。

于 2009-11-02T21:09:01.610 回答
3

如果您通过添加更多数字位置来扩展左侧,您会看到进位向左滚动到无限数量的位位置,因此您永远不会真正得到最终进位 1。所以答案是肯定的.

 ...000100
+...111101
----------
....000001
于 2009-11-02T21:02:07.543 回答
2

在某些时候,您必须设置位数来表示数字。他选择了4位。任何进入第 5 位的进位都会丢失。但这没关系,因为他决定只用 4 位来表示数字。

如果他决定使用 5 位来表示数字,他会得到相同的结果。

于 2009-11-02T21:01:18.163 回答
2

这就是它的美妙之处......您的结果将与您添加的条款的大小相同。所以第五位被扔掉了

在 2 的补码中,您使用进位位来表示最后一次操作中是否存在溢出。

您必须查看最后两个进位位以查看是否存在溢出。在您的示例中,最后两个进位11表示没有溢出。

如果最后两个进位位是1100没有发生溢出。如果最后两个进位位是1001则有溢出。这就是为什么他有时关心进位位而有时却忽略它的原因。

下面的第一行是进位行。此行中最左边的位用于确定是否存在溢出。

1100
 0100
 1101
 ----
 0001
于 2009-11-02T21:02:07.200 回答
1

看起来你只使用 4 位,所以没有 16 的列。

如果您使用超过 4 位,则 -3 表示会有所不同,并且数学的进位仍然会被丢弃。例如,使用 6 位,您将拥有:

 000100
 111101
 ------
1000001

并且由于进位超出了您的表示的位范围,因此它消失了,您只有000001

于 2009-11-02T21:02:14.157 回答
1

考虑 25 + 15:

5+5 = 10,我们保留0,让1进入十列。然后是 2 + 1 (+ 1) = 4。因此结果是 40 :)

二进制文件也是如此。0 + 1 = 1, 0 + 0 = 0, 1 + 1 = 10 => 将 1 发送到 8 列,0 + 1 ( + 1 ) = 10 => 将 1 发送到下一列 - 这是溢出和为什么我们只是把 1 扔掉。

这就是为什么 2 的补码如此出色的原因。它允许您像使用 base-10 一样添加/减去,因为您(ab)使用符号位是 MSB 的事实,当需要时,它将级联操作一直到溢出。

希望我让自己明白。当英语不是您的母语时,很难解释这一点:)

于 2009-11-02T21:02:33.620 回答
1

在执行 2 的补码加法时,进位表示问题的唯一时间是存在溢出条件 - 如果 2 个操作数具有不同的符号,则不会发生这种情况。

如果它们具有相同的符号,则溢出条件是符号位从 2 个操作数发生变化时,即最高有效位有进

如果我记得我的计算机体系结构正在学习,这通常在硬件级别通过一个标志检测到,该标志在最高有效位进位与最高有效位的进位不同时设置。在您的示例中情况并非如此(msb 和 msb 都有进位)。

一种简单的思考方式是“标志不变”。如果进入 msb 的进位与进位不同,则符号已不正确地更改。

于 2009-11-02T21:04:46.493 回答
0

携带被丢弃是因为没有任何可以用它做的事情。如果它对结果很重要,则意味着操作溢出了可以存储在结果中的值范围。在汇编程序中,通常有一条指令可以测试超出结果末尾的进位,您可以在那里显式处理它 - 例如,将其携带到多精度值的下一个较高部分。

于 2009-11-02T21:01:57.467 回答
0

因为您在谈论 4 位表示。与实际机器相比,这是不寻常的,但如果我们想当然地认为计算机的每个字节中有 4 位,那么我们有以下属性:一个字节在 15 到 -15 处换行。超出该范围的任何内容都无法存储。此外,无论如何,您将如何处理符号位之外的额外第 5 位?

现在,鉴于此,我们可以从日常数学中看到4 + (-3) = 1,这正是你得到的。

于 2009-11-02T21:02:56.233 回答