0

历史:我从 Knuth 的一本算法书中读到,第一台计算机使用 10 的底数。然后,它在这里切换到二进制补码。

问题:为什么基数在至少一个幺半群中不能为-2?

例子:

(-2)^1 = -2 
(-2)^3 = -8
4

8 回答 8

19

问题在于,对于负二元(基数 -2)系统,它更难以理解,并且可能的正值和负值的数量不同。要了解后一点,请考虑一个简单的 3 位案例。

这里第一个(最右边)位代表十进制 1;中间位代表十进制-2;第三个(最左边)位代表十进制 4

所以

000 -> 0

001 -> 1

010 -> -2

011 -> -1

100 -> 4

101 -> 5

110 -> 2

111 -> 3

因此可表达值的范围是-2到5,即非对称。

于 2009-07-08T17:04:44.400 回答
16

从本质上讲,数字逻辑是以二为基础的。数字信号打开或关闭。支持其他基础(如在 BCD 中)意味着浪费表示空间、更多工程、更复杂的规范等。

编辑添加:除了数字逻辑中单个二进制数字的简单表示之外,加法很容易在硬件中实现,启动半加法器,在布尔逻辑中很容易实现(即使用晶体管):

   (No carry) (with carry)
  |  0   1      0   1
--+--------------------
0 | 00  01     01  10
1 | 01  10     10  11

(返回的数字是(A xor B) xor C,进位是((A and B) or (C and (A or B))))然后将它们链接在一起以生成一个完整的寄存器加法器。

这给我们带来了二进制补码:取反很容易,并且混合正负数的加法自然而然地遵循,无需额外的硬件。所以减法几乎是免费的。

很少有其他表示可以如此便宜地实现算术,而且我知道没有比这更容易的了。

于 2009-07-08T16:56:06.100 回答
3

存储优化和处理时间优化往往是相互交叉的;在所有其他条件相同的情况下,简单通常胜过复杂。

任何人都可以为他们想要的信息提出任何存储机制,但除非有支持它的处理器或算法,否则它不会被使用。

于 2009-07-08T16:59:50.930 回答
3

选择基数 2 而不是基数 -2 有两个原因:

首先,在许多应用程序中,您不需要表示负数。通过将它们的表示隔离为单个位,您可以扩展可表示数字的范围,或者在不需要负数时减少所需的存储空间。在 base -2 中,即使您裁剪范围,您也需要包含负值。

其次,2s补码硬件实现简单。不仅实现简单,而且实现支持有符号和无符号算术的 2s 补码硬件也非常简单,因为它们是相同的。也就是说 uint4(8) 和 sint4(-15) 的二进制表示是一样的,uint(7) 和 sint4(7) 的二进制表示是一样的,也就是说你可以在不知道不管它是否被签名,这些值都可以通过任何一种方式来解决。这意味着 HW 可以完全避免对符号一无所知,并将其作为语言约定处理。

于 2009-07-08T18:14:55.177 回答
2

此外,二进制系统的使用具有数学背景。考虑克劳德香农信息论。我的英语技能不足以解释这个话题,所以最好点击维基百科的链接,享受所有这些东西背后的数学。

于 2009-07-08T17:41:19.490 回答
0

1 的补码确实有 0 和 -0 - 这就是你所追求的吗?

CDC 曾经生产 1 的补码机器,正如您所建议的那样,这使得否定非常容易。据我了解,它还允许他们生产不侵犯 IBM 关于 2 的补码二进制减法器专利的减法硬件。

于 2009-07-08T16:56:00.983 回答
0

最后,由于电压变化而做出了决定。

使用 base 2,它是打开或关闭的,没有介于两者之间。

但是,以 10 为底,你怎么知道每个数字是什么?

0.1 伏特是 1 吗?0.11 呢?电压可以变化并且不精确。这就是为什么模拟信号不如数字信号的原因。如果您为 HDMI 电缆支付的费用超过 6 美元,这就是一种浪费,无论它是否到达那里都是数字的。音频确实很重要,因为信号可以改变。

于 2009-07-08T17:02:02.487 回答
0

请看一个 dmckee 在没有示例的情况下指出的复杂性示例。所以你可以看到一个例子,数字 0-9:

0 = 0
1 = 1
2 = 110
3 = 111
4 = 100
5 = 101
6 = 11010
7 = 11011
8 = 11000
9 = 11001
于 2009-07-08T17:12:19.657 回答