【问题标题】:Problems with subtracting in binary aritmetics二进制算术中的减法问题
【发布时间】:2014-01-24 14:56:02
【问题描述】:

我想知道当减去的数字小于另一个数字时,我如何实现二进制算法的 2-complements 方法。例如 - 如果我想从 12 中减去 13 ...即 12 -13 = -1。

我尝试了以下步骤:

1) 12 到二进制使用 8 位 (0000 1100)

2) -13 到二进制使用 2 补码:

a) 使用 8 位将 13 转换为二进制:0000 1101

b) 反转:1111 0010

c) 加 1:1111 0010 + 1 = 1111 0011

所以如果我计算正确,结果 (1111 0011) 表示 -13。所以让我们用 12 来添加这个负表示:

  00001100 + 11110011 = 11111111

所以我不明白结果 - 只有一个:s (1111...)

当结果为负时会发生这种情况。显然我错过了一些东西。

感谢帮助!!!!

【问题讨论】:

  • 欢迎来到 Stack Overflow!看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • @kkuilla 他甚至没有要求代码只是一个解释
  • OP,在我看来11111111 是正确答案-1
  • @OGHaza 是的,但前提是他将值解释为已签名。否则为 255。
  • @OnoSendai 但是他已经在计算的早期将 -13 解释为已签名,但是是的,你是对的,这一定是误解所在。

标签: binary


【解决方案1】:

恭喜,您刚刚发现有符号/无符号整数表示之间的区别!

我们以Uint16 格式(无符号 16 位)为例。它可以表示从 0(二进制 0000000000000000)到 65535(二进制(1111111111111111)的任何整数值。

那么,将 1 加到 65535 会发生什么?您将需要另一个 Uint16 来表示该值,并且第一个将再次全为零:

00000000000000010000000000000000

现在,Uint16 的签名版本Int16 的范围可能在 -32,768 到 32,767 之间。为什么?因为它可能会使用其最高有效位来确定信号

像这样,对于Int8(有符号整数,8 位),这恰好是您在示例中使用的格式:

00000000 -> 0
00000001 -> 1
00000010 -> 2
[...]
01111110 -> 126
01111111 -> 127
10000000 -> -128 (MSB set - number is negative)
10000001 -> -127
10000010 -> -126
[...]
11111110 -> -2
11111111 -> -1 <- (This is your result!)

请注意,您在执行步骤 B 时已经考虑到这一点 - 通过反转您将 MSB 设置为 1,从而表明该值为负数。

如果不考虑信号位,您的计算将达到算术溢出状态。

以下链接可能有助于解决您的问题:

Bitwise Operator on positive and negative numbers

Signed number representations - 维基百科

Integer (computer science) - 维基百科

【讨论】:

  • 非常感谢您的帮助!!!但是我仍然不明白计算机(处理器)如何知道何时将值解释为已签名?我知道它是因为我可以用我的眼睛看到它 - 但是计算机如何知道何时将 11111111 视为负数而不是将其视为 255?
  • 你可能会从这个链接中受益,@user3232476: en.wikipedia.org/wiki/Overflow_flag
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多