为什么零被视为正号?

aka*_*wal 0 signal

有符号整数或二进制数字

零被视为正号

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 为负号

Jam*_*han 9

您最初的断言并不是真的,对于绝大多数使用“二进制补码算法”的常见用途的 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。这使得算术变得更加复杂,这就是不使用它的原因。