历史:我从 Knuth 的一本算法书中读到,第一台计算机使用 10 的底数。然后,它在这里切换到二进制补码。
问题:为什么基数在至少一个幺半群中不能为-2?
例子:
(-2)^1 = -2
(-2)^3 = -8
问题在于,对于负二元(基数 -2)系统,它更难以理解,并且可能的正值和负值的数量不同。要了解后一点,请考虑一个简单的 3 位案例。
这里第一个(最右边)位代表十进制 1;中间位代表十进制-2;第三个(最左边)位代表十进制 4
所以
000 -> 0
001 -> 1
010 -> -2
011 -> -1
100 -> 4
101 -> 5
110 -> 2
111 -> 3
因此可表达值的范围是-2到5,即非对称。
从本质上讲,数字逻辑是以二为基础的。数字信号打开或关闭。支持其他基础(如在 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)))
)然后将它们链接在一起以生成一个完整的寄存器加法器。
这给我们带来了二进制补码:取反很容易,并且混合正负数的加法自然而然地遵循,无需额外的硬件。所以减法几乎是免费的。
很少有其他表示可以如此便宜地实现算术,而且我知道没有比这更容易的了。
存储优化和处理时间优化往往是相互交叉的;在所有其他条件相同的情况下,简单通常胜过复杂。
任何人都可以为他们想要的信息提出任何存储机制,但除非有支持它的处理器或算法,否则它不会被使用。
选择基数 2 而不是基数 -2 有两个原因:
首先,在许多应用程序中,您不需要表示负数。通过将它们的表示隔离为单个位,您可以扩展可表示数字的范围,或者在不需要负数时减少所需的存储空间。在 base -2 中,即使您裁剪范围,您也需要包含负值。
其次,2s补码硬件实现简单。不仅实现简单,而且实现支持有符号和无符号算术的 2s 补码硬件也非常简单,因为它们是相同的。也就是说 uint4(8) 和 sint4(-15) 的二进制表示是一样的,uint(7) 和 sint4(7) 的二进制表示是一样的,也就是说你可以在不知道不管它是否被签名,这些值都可以通过任何一种方式来解决。这意味着 HW 可以完全避免对符号一无所知,并将其作为语言约定处理。
1 的补码确实有 0 和 -0 - 这就是你所追求的吗?
CDC 曾经生产 1 的补码机器,正如您所建议的那样,这使得否定非常容易。据我了解,它还允许他们生产不侵犯 IBM 关于 2 的补码二进制减法器专利的减法硬件。
最后,由于电压变化而做出了决定。
使用 base 2,它是打开或关闭的,没有介于两者之间。
但是,以 10 为底,你怎么知道每个数字是什么?
0.1 伏特是 1 吗?0.11 呢?电压可以变化并且不精确。这就是为什么模拟信号不如数字信号的原因。如果您为 HDMI 电缆支付的费用超过 6 美元,这就是一种浪费,无论它是否到达那里都是数字的。音频确实很重要,因为信号可以改变。
请看一个 dmckee 在没有示例的情况下指出的复杂性示例。所以你可以看到一个例子,数字 0-9:
0 = 0
1 = 1
2 = 110
3 = 111
4 = 100
5 = 101
6 = 11010
7 = 11011
8 = 11000
9 = 11001