【发布时间】:2011-02-05 22:51:57
【问题描述】:
我知道无符号,二进制补码,一个的补码和符号幅度,以及它们之间的区别,但我很好奇的是:
- 为什么叫二(或一)补码,那么有没有更通用的 N 补码?
- 这些天才是通过什么方式演绎出如此自然的方式来表示负数的?
【问题讨论】:
-
“二进制数的补码定义为从2的大幂中减去该数得到的值”-en.wikipedia.org/wiki/Two's_complement
我知道无符号,二进制补码,一个的补码和符号幅度,以及它们之间的区别,但我很好奇的是:
【问题讨论】:
当有人意识到通过从 0 中减去 1 并让位翻转实际上使有符号算术变得更简单,因为不需要进行特殊检查来检查数字是否为负数或不是。其他解决方案使您在-1 和0 之间出现不连续性。二进制补码的唯一奇怪之处在于,在你的范围内你得到的负数比你得到的正数多一个。但是,然后,其他解决方案会给您带来奇怪的东西,例如 +0 和 -0。
根据 Wikipedia,该名称本身来自数学,并且基于在数量有限的情况下使减法更简单的方法。该系统实际上是一个“基数补码”,并且由于二进制是以二为底的,这成为“二进制补码”。原来“一个补码”是以“减基数补码”命名的,也就是基数减一。如果您将其视为十进制,则名称背后的含义会更有意义。
【讨论】:
你可以在其他基地做同样的事情。使用十进制,您将有 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”如何补码 不过是有道理的。
【讨论】:
在十进制数系统中,radix是十:
在二进制编号系统中,radix是二:
【讨论】:
我最近一直在阅读这方面的内容。我可能是错的,但我想我明白了......
补码的基本概念很简单:它是一个数字和另一个数字之间的剩余差。例如,在我们常规的十进制表示法中,我们只有 0 到 9 的十位数字,我们知道 9 和 3 的差是 6,所以我们可以说“3 的补码是 6”。
从那时起,我发现有些东西很容易混淆,在线帮助很少:我们如何选择使用这些补码来实现减法或负值表示取决于我们!有多种方法,有两种主要接受的方法都有效,但优缺点各不相同。补码的重点是用在这些方法中,但是“九的补码”本身不是减法或负号表示方法,它只是九与另一个数字的差。
旧式的“九进制补码”翻转十进制数的方式(九进制补码在十进制的上下文中也可以称为“减少的基数补码”,因为我们需要找到一种复杂的花哨方式来表示它小于十)来执行负值的加法效果很好,但是它为 0 提供了两个不同的值(+0 和 -0),这在计算机上是一种昂贵的内存浪费,并且还需要额外的工具和步骤用于承载价值,这增加了时间或资源。
后来,有人意识到,如果你取九的补码,然后加 1,然后去掉最高有效位以外的任何账面值,你也可以实现负值表示或减法,而只有一个 0 值,并且最后不需要执行任何结转。 (唯一的缺点是您的值在负数和正数之间的分布是不均匀的。)因为该操作涉及取九的补码并在其上加一个,所以我们将其称为“十的补码”作为一种速记。注意名称中撇号的不同位置。我们有两个使用相同名称的不同计算。 “十补”的方法与“十补”不同。前者使用我提到的第二种方法,而后者使用我提到的第一种(旧)方法。
然后,为了让名字更简单,我们说,“嘿,我们称之为十的补码,它翻转一个以 10 为底的数字(十进制表示),所以当我们使用它时,我们应该称之为“基数补码”。当我们在基数 10 中使用九的补码时,我们应该将其称为“减少的基数补码”。同样,这令人困惑,因为我们正在颠倒它在我们的术语中实际发生的方式......十的补码实际上是之所以命名是因为它是“九的补码加一”,但现在我们基本上称它为“十的补码减少”。
然后同样的事情也适用于二进制补码和二进制补码。
【讨论】: