【问题标题】:two's complement, why the name "two"二的补码,为什么叫“二”
【发布时间】:2011-02-05 22:51:57
【问题描述】:

我知道无符号,二进制补码,一个的补码和符号幅度,以及它们之间的区别,但我很好奇的是:

  1. 为什么叫二(或一)补码,那么有没有更通用的 N 补码?
  2. 这些天才是通过什么方式演绎出如此自然的方式来表示负数的?

【问题讨论】:

标签: binary computer-science


【解决方案1】:

当有人意识到通过从 0 中减去 1 并让位翻转实际上使有符号算术变得更简单,因为不需要进行特殊检查来检查数字是否为负数或不是。其他解决方案使您在-10 之间出现不连续性。二进制补码的唯一奇怪之处在于,在你的范围内你得到的负数比你得到的正数多一个。但是,然后,其他解决方案会给您带来奇怪的东西,例如 +0-0

根据 Wikipedia,该名称本身来自数学,并且基于在数量有限的情况下使减法更简单的方法。该系统实际上是一个“基数补码”,并且由于二进制是以二为底的,这成为“二进制补码”。原来“一个补码”是以“减基数补码”命名的,也就是基数减一。如果您将其视为十进制,则名称背后的含义会更有意义。

Method of Complements (Wikipedia)

【讨论】:

  • 唯一要补充的是,就像 CPU 寄存器具有固定位数一样,要推广到基数 N,您必须在固定位数内工作。
  • 为什么叫ones的补码(“one”是复数形式,即不是“one的补码”),而two的补码是单数形式的两个?
  • @user1596274 此评论中的“补充方法”链接提供了一些解释。我相信您可以通过这种方式对其进行合理化:“二的补码”中的“二”是指基数(二进制为 2)。 “ones'补码”中的“one”指的是你如何在这个系统中否定一个数字:对于每个数字(通常有多个或多个,因此是复数形式),新数字是通过从1中减去它来计算的. 顺便说一句,这同样适用于存储 10 进制数(即十进制)的系统 - 会有“十进制补码”和“九进制补码”
【解决方案2】:

你可以在其他基地做同样的事情。使用十进制,您将有 9 的补码,其中每个数字 X 被 9-X 替换,并且数字的 10 的补码是 9 的补码加一。然后,您可以通过添加 10 的补码来减去,假设位数是固定的。

一个例子 - 在一个 4 位系统中,给定减法

 0846
-0573
=0273

首先找到 573 的 9 的补码,即 9-0 9-5 9-7 9-3 或 9426
573 的 10 的补码是 9426+1,或 9427
现在添加 10 的补码并扔掉任何超出 4 位的数字

   0846
  +9427      .. 10's complement of 573
= 10273      .. toss the 'overflow' digit
=  0273      .. same answer

显然这是一个简单的例子。但是这个类比存在。有趣的是 4 位 10 的补码中最负的值? 5000!

至于词源,我推测术语 1 的补码是一个补码,与几何学的补角是 90 度减去角度相同 - 即,它是从给定值中减去给定值时剩下的部分一些标准值。不确定“2”如何补码 不过是有道理的。

【讨论】:

  • “2 的补码”,因为它是以 2 为底的。通用术语是“基数补码”。
  • 这真是奇怪,为什么将N的补码称为N-1减去数字的结果?而不是从 N 中减去它。
  • @phkahler:因为在基数 N 中,从 N-1 中减去每个数字,然后加 1,正好对应于从 N 的适当幂中减去该数字。例如,0573 的 10 的补码是 9426+1=9427,正好是 10000-573。这也是该方法有效的原因:846-573 = 846+(10000-573)-10000。 [琐事:这对应于所谓的“吠陀数学”中称为“从九开始,最后从十开始”的规则:en.wikipedia.org/wiki/Vedic_Mathematics]
【解决方案3】:

在十进制数系统中,radix

  • 基数补码称为十的补码
  • 小数补码被称为九的补码

在二进制编号系统中,radix

  • 基数补码称为二进制补码
  • 小数补码称为个数补码

来源:https://en.wikipedia.org/wiki/Method_of_complements

【讨论】:

    【解决方案4】:

    我最近一直在阅读这方面的内容。我可能是错的,但我想我明白了......

    补码的基本概念很简单:它是一个数字和另一个数字之间的剩余差。例如,在我们常规的十进制表示法中,我们只有 0 到 9 的十位数字,我们知道 9 和 3 的差是 6,所以我们可以说“3 的补码是 6”。

    从那时起,我发现有些东西很容易混淆,在线帮助很少:我们如何选择使用这些补码来实现减法或负值表示取决于我们!有多种方法,有两种主要接受的方法都有效,但优缺点各不相同。补码的重点是用在这些方法中,但是“九的补码”本身不是减法或负号表示方法,它只是九与另一个数字的差。

    旧式的“九进制补码”翻转十进制数的方式(九进制补码在十进制的上下文中也可以称为“减少的基数补码”,因为我们需要找到一种复杂的花哨方式来表示它小于十)来执行负值的加法效果很好,但是它为 0 提供了两个不同的值(+0 和 -0),这在计算机上是一种昂贵的内存浪费,并且还需要额外的工具和步骤用于承载价值,这增加了时间或资源。

    后来,有人意识到,如果你取九的补码,然后加 1,然后去掉最高有效位以外的任何账面值,你也可以实现负值表示或减法,而只有一个 0 值,并且最后不需要执行任何结转。 (唯一的缺点是您的值在负数和正数之间的分布是不均匀的。)因为该操作涉及取九的补码并在其上加一个,所以我们将其称为“十的补码”作为一种速记。注意名称中撇号的不同位置。我们有两个使用相同名称的不同计算。 “十补”的方法与“十补”不同。前者使用我提到的第二种方法,而后者使用我提到的第一种(旧)方法。

    然后,为了让名字更简单,我们说,“嘿,我们称之为十的补码,它翻转一个以 10 为底的数字(十进制表示),所以当我们使用它时,我们应该称之为“基数补码”。当我们在基数 10 中使用九的补码时,我们应该将其称为“减少的基数补码”。同样,这令人困惑,因为我们正在颠倒它在我们的术语中实际发生的方式......十的补码实际上是之所以命名是因为它是“九的补码加一”,但现在我们基本上称它为“十的补码减少”。

    然后同样的事情也适用于二进制补码和二进制补码。

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 2017-02-27
      • 1970-01-01
      • 2015-08-26
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多