为什么带符号的负整数从最低值开始?

Why do signed negative integers start at the lowest value?

我真的无法用文字来解释这个问题(可能是我找不到答案的原因),所以我会尽力提供尽可能详细的信息。这不是一个实际问题,我只是好奇。

假设我们有一个带符号的 8 位整数。

sign | bytes   | sign 0 | sign 1
?    | 0000000 | (+)0   | (-)128
?    | 1111111 | (+)127 | (-)1

我不明白为什么会这样,谁能解释一下?在我看来,值相同并且符号只在前面加上一个加号或减号更有意义,所以对我来说它看起来是向后的。

有符号整数有几个系统。

其中之一,符号大小,正是您所期望的:一部分表示数字有多大,另一部分表示数字为正数或取负数。这使得符号位非常特别,与其他位有很大不同。例如:

sign-magnitude representation
0_0000000 = 0
0_0000001 = 1
1_0000001 = -1
1_0000000 = -0

这有一些令人不舒服的副作用,主要是不再以有用的方式对应于无符号算术(如果你添加两个符号大小的整数,就好像它们是无符号的奇怪的事情发生,例如 -0 + 1 = -1 ),这具有深远的影响:addition/subtraction/equals/multiplication 都需要它们的特殊符号版本,乘以和除以 2 的幂绝不对应于位移位(意外除外),因为它与 [= 没有明确的相关性27=]^k Z 目前还不清楚它的代数行为。 -0 也作为与 0 不同的事物存在,这很奇怪并且会根据您对它的语义导致不同类型的问题,但从来没有没有问题。

到目前为止最常见的系统是二进制补码,其中符号位并不表示 "times 1 or times -1" 而是 "add 0 or add -2^k"。与 1 的补码一样,符号位 很大程度上 是一个完全正常的位(除法和右移除外)。例如:

two's complement representation (8bit)
00000000 = 0 (no surprises there)
10000000 = -128
01111111 = 127
11111111 = -1 (= -128 + 127)
etc

现在请注意,11111111 + 00000001 = 0 在无符号 8 位算术中无论如何,-1+1=0 显然是可取的(实际上它是 -1 的定义)。所以它归结为,至少对于 addition/subtraction/multiplication/left shift,是普通的旧无符号算术 - 你只是以不同的方式打印数字。当然,一些运营商仍然需要特殊的签名版本。由于它非常接近无符号算术,因此您可以像在 Z/2^k Z 中一样自信地推理加法和乘法。它确实有一点可以与负零的存在相提并论,即存在一个没有正绝对值的负数。

使值相同并在前面加上正负号的想法是一个众所周知的想法,称为 signed magnitude 表示或类似表达式。一个讨论 here 说带符号幅度表示的两个主要问题是有两个零(加号和减号),并且整数运算在计算机算法中变得更加复杂。

一种流行的计算机替代方法是 补码 表示,这就是您要问的问题。这种表示法使算术算法更简单,但是当您想象沿着数字线绘制二进制值时,就像您正在做的那样,看起来很奇怪。二进制补码也有一个零,它解决了第一个主要问题。

维基百科中的带符号数字表示文章 comparison tables 说明了带符号的大小、二进制补码以及从 -11 到 +16 的十进制数字行和从0000 到 1111.