有符号整数或二进制数字
零被视为正号
和
1 被视为负号。
例如 :-
1000 0000 0000 0110 = -6
0000 0000 0000 0110 = 6
Run Code Online (Sandbox Code Playgroud)
但在脉冲形式中,1 被视为正值,0 被视为中性值。
--- --- ---
| | | | | |
--------- --- --- ---------
Run Code Online (Sandbox Code Playgroud)
为什么?背后有没有什么逻辑。
是否有可能以相反的方式对待它,即 1 为正号,0 为负号
您最初的断言并不是真的,对于绝大多数使用“二进制补码算法”的常见用途的 CPU 架构而言并非如此。
在 2 的补码运算中,如果高位为 1,则表示为负数;但如果高位为 0,则不表示正数。它表示非负。区别很微妙,但很重要。该数字可能为零,也可能为正数。
在 2 的补码中,数字标度如下所示 - 为简单起见,我将使用 8 位整数:
二进制有符号无符号 01111111 127 127 01111110 126 126 ... 00000011 3 3 00000010 2 2 00000001 1 1 00000000 0 0 11111111 -1 255 11111110 -2 254 ... 10000010 -126 130 10000001 -127 129 10000000 -128 128
要在该系统中取反(算术取反),即乘以 -1:首先取反所有位,然后加 1。因此,如果我们从 1 开始,取反位,我们将得到 11111110。加1,我们有11111111。如上。请注意,如果我们再做一次,我们会回到 00000001,我们应该这样做。
计算机使用这个系统是因为它使加法、减法等算术逻辑非常简单:相同的逻辑(简单的二进制加法器;您只需将所有位相加,包括符号位)适用于有符号数和无符号数。请注意,在该范围内的任何数字上加 1 都会得到正确的答案……溢出情况除外:如果将数字解释为有符号数,则将 1 加到 127 的结果为 -128。但是溢出和进位等通常被条件标志或异常捕获。
这是一个奇怪的二进制补码怪癖,我们的负数比正数多一个......因为零既不是负数也不是正数。因此,使用有符号的八位,我们可以表示 -128,但不能表示 +128。+127 是最大的正数。这不是什么大问题。
一些历史计算机(CDC 3000 和 6000 系列,以及一些旧的 Univac 大型机;我知道没有当代的例子)已经使用“一个补码”构建。在一个人的补码中,要反转一个数字,您只需翻转位。这导致与上面几乎相同的比例,除了负侧从 -127 到... -0!没错,在一个人的补偿中。机器,你有两个零:正零和负零。这使得算术通常更加复杂。负零通常在某个时候转换为正。
您可能认为它应该更像是“有符号幅度”,这类似于我们通常写数字的方式。例如 -2 将是 10000002。您会注意到,将其加 1 并不能为您提供 -1 的正确有符号幅度表示。它给你 -3。这使得算术变得更加复杂,这就是不使用它的原因。