【发布时间】:2013-02-05 23:30:51
【问题描述】:
当使用二进制补码执行按位减法时,如何知道何时应该忽略溢出?我读过的几个网站都说溢出被简单地忽略了,但这并不总是有效——溢出对于像-35 - 37这样的问题是必要的,因为需要一个额外的数字来表达-72的答案。
编辑:这是一个例子,使用上面的公式。
35 转二进制 -> 100011,求补码使其为负:011101
37 转二进制 -> 100101,求补码使其为负:011011
执行上述项的加法(-35 - 37 的二进制等效项):
011101
011011
------
111000
取二进制补码转换回正数:001000
以上是许多网站(包括学术网站)所说的答案,因为您忽略了溢出。然而,这显然是不正确的。
【问题讨论】:
-
显然那些网站并没有描述如何按位计算
-32 - 37:-) -
This answer 说明了这一点,以及this academic webpage 上的第 4 步。 This PowerPoint(Google 查看器链接)也在幻灯片 9 上显示。
-
什么是按位减法?你的意思是2的补码中的减法?如果是这种情况,那么您的问题应该是,2 的补码加法宽度为
N(例如)的负整数何时溢出? -
你能解释一下你对“按位”减法的期望吗?这和减法有区别吗? (您使用的是 - 运算符,所以我不知道您所说的按位是什么意思?)另外,我在您的示例中没有看到任何溢出?你可以在这里查看hackersdelight.org,了解一些方便的溢出检测算法。此外,根据您的硬件,有时会在发生溢出时设置一个寄存器位(但这只是在它发生之后)。
-
刚刚在主帖中添加了一个使用
-35 - 37的示例,这有帮助吗?
标签: c bit-manipulation bitwise-operators