【问题标题】:2's Complement Error2 的补码错误
【发布时间】:2016-03-31 02:34:36
【问题描述】:

我大致了解 2 的补码的概念。将值转换为 2 的补码进行减法时,只需将数字的每个数字取反即可得到 1 的补码并加 1。当以二进制计算 2-2 之类的结果时,首先将 -2 转换为 2 的补码,(我喜欢使用 4 位表示)0010 变成 1101,然后变成 1110。然后你评估 0010 + 1110 并得到 0000,溢出的 1 被截断。

但是,像 2-3 这样的问题呢?所以我做了同样的操作。 2 是 0010,3 (0011) 的 2 的补码是 1101。所以 0010 + 1101 导致 1111 并且没有溢出。结果是 15。15 不是负数 1。我是否错过了其他网站和来源忽略提及的关于 2 的补码如何工作的关键点?

【问题讨论】:

  • 2 的补码中的 -1 是什么?
  • 所以我想我的问题不够具体。所以这意味着任何时候我做减法,结果都将是 2 的补码,然后必须再次进行 2 的补码运算才能接收无符号二进制表示?

标签: binary subtraction twos-complement


【解决方案1】:

在 2 的恭维中 1111 是 -1(如果你当然只有 4 位)

从1111到它的绝对值取反:

0000

并添加 1

0001

【讨论】:

  • 那么减法的结果是否总是以 2 的补码形式出现,然后必须将其恢复为无符号二进制表示形式?
  • 如果要查看绝对值,可以。如果您想继续将其用于算术,请保持原样。
  • @OrrenRavid。 -1 没有无符号二进制表示。您正在用 2 的补码进行算术运算;你会在 2 的补码中得到答案。这个答案是 -1 的 2 的补码表示。
  • @OrrenRavid 当您以 2s 补码计算时,所有结果当然都会以 2s 补码计算。您必须选择是否准备溢出,是否要签名或未签名等。
  • 那么这是否意味着使用 4 位表示完成的所有 2 的补码算术只能在 0000 到 0111 的正值和 1000 到 1111 的负值中完成?
【解决方案2】:

记住你正在做有符号算术。

在有符号算术中,最高有效位或最左边位置的 1 表示 (-) 符号。

所以 1111 是一个负数。

1111翻转为0000加1为0001。

所以答案的大小为 1,符号为 (-)。

2-3=-1

【讨论】:

    【解决方案3】:

    当您以二进制补码计算时,结果总是必须作为二进制补码处理。如前所述,结果是带符号二进制补码的 -1,或 15 无符号且无溢出。

    你需要注意的是,如果你用正数做减法,结果将是负数,你将不会溢出。但是如果结果是肯定的,就会有 溢出。

    这是合乎逻辑的:如果结果为正,则它必须小于原始值。加法产生较小值的唯一方法是溢出。当结果为负时,当作为无符号处理时,它总是大于原始值(MSB 为 1,而原始值为 0)并且没有溢出。

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 2014-11-14
      • 2012-06-18
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多