【问题标题】:Subtracting a large unsigned binary number from a smaller one从一个较小的数字中减去一个较大的无符号二进制数
【发布时间】:2012-03-20 08:39:39
【问题描述】:

我正在学习计算机组织和汇编语言课程。本周我们实验室的书面部分有一个问题让我很难过。问题是……

减去以下无符号二进制数(显示借位和溢出位)。不要转换为二进制补码。

 0101 0111 1101
-1110 1011 0110
 --------------

我知道答案是 -1001 0011 1001,但我很难弄清楚如何借用更大的数字并从较小的数字并展示我的作品。从一个小数中减去一个大数时,我的整个生活都扭转了这个问题,而是从较大的数中减去了较小的数,并在结果前面加上了一个负号。我问过教授,他说他希望问题以书面的方式解决。我不能通过从较大的数字中减去较小的数字并像往常一样否定来解决这个问题。我无法在网上找到任何从较小的无符号二进制数中减去较大的无符号二进制数的示例。

如果有人能向我描述如何在这种情况下执行减法,我将不胜感激。

更新: @Alex 是正确的。教授在找

0110 1100 0111 (1735)

谢谢大家。

【问题讨论】:

  • 你确定他不希望0110 1100 0111 带有一些借位和溢出位的指示吗?
  • @Beta:不,答案是-1001 0011 1001 (-2361)。他只是在处理普通的二进制数,而不是像 2's-complement 这样的特定计算机表示。
  • 我不确定教授是在 -1001 0011 1001(-2361) 还是 0110 1100 0111(1735) 之后,我最终选择了 1735。我认为 @Beta 是对的。当实验室归还时,我会回复他正在寻找的东西。

标签: math binary theory subtraction


【解决方案1】:

无论哪个数字更大哪个更小,您都以相同的方式进行操作。

 bb b      bb   <- borrows
 0101 0111 1101 (1405)
-1110 1011 0110 (3766)
 --------------
 0110 1100 0111 (1735?)

现在,如果你想要一个适当的差异,你需要考虑溢出,因为上面的结果不包括符号位:

 b bb b      bb   <- borrows
 0 0101 0111 1101 (1405)
-0 1110 1011 0110 (3766)
 ----------------
 1 0110 1100 0111 (-2361 signed 2's complement)

真的,CPU 并不关心从什么中减去什么。它对整数加法/减法使用相同的算法,此外,该算法对于有符号和无符号整数是相同的。您只需正确解释结果以及进位和溢出标志。就是这样。

【讨论】:

  • 谢谢亚历克斯。我怀疑您的最佳示例是教授所追求的。这就是我在尝试解决问题时不断得到的。我认为这可能是问题的关键......表明在这种情况下减法不会产生正确的结果。我想我只是从错误的心态来解决问题。
  • @BlueRaja-DannyPflughoeft:他说“不要转换为二进制补码。”我没有转换任何东西。
  • MSD 0 - 1 - 1 = 0 怎么样?
  • @AbhijitSarkar 如果您只有两个二进制数字(0 和 1)并且需要两次加/减 1,还应该有什么?
  • @AbhijitSarkar 在模 2 算术中加/减 1 反转数字(0 变为 1 或 1 变为 0)。这样做两次可以保留它。没有其他可能。
【解决方案2】:

简单地将两个二进制数相减,然后取结果的 2 的补码。瞧!

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2019-03-10
    • 2020-07-30
    相关资源
    最近更新 更多