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

时间:2017-05-18 13:12:11

标签: sign

我无法单独用语言解释这个问题(可能为什么我找不到答案),所以我会尝试尽可能多地提供详细信息。这不是一个实际问题,我只是好奇。

所以假设我们有一个签名的8bit int。

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

我不明白为什么这种方式有效,有人可以解释一下吗?在我的脑海中,更有意义的是价值是相同的,并且标志只是在前面加上或减去,所以对我来说它看起来倒退了。

2 个答案:

答案 0 :(得分:2)

有几个有符号整数的系统。

其中之一,符号幅度,正是你所期望的:一个部分说明这个数字有多大,还有一个部分要么保留正数,要么否定它。这使得符号位非常特殊,与其他位大不相同。例如:

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

这有一些令人不舒服的副作用,主要是不再以有用的方式对应无符号算术(如果你添加两个符号幅度整数,好像它们是无符号奇怪的事情发生,例如-0 + 1 = -1),这具有深远的影响:加法/减法/等于/乘法都需要它们的特殊签名版本,乘法和除以2的幂不会对应于位移(除了意外),因为它与Z /没有明确的相关性2 ^ k Z它没有立即清楚它是如何以代数方式表现的。 -0也与0分开存在,这很奇怪,根据你的语义会产生不同的麻烦,但绝不会有麻烦。

到目前为止,最常见的系统是两个补码,其中符号位不表示"乘以1或-1和#34;但是"添加0或添加-2 ^ k"。与一个补码一样,符号位很大程度上一个完全正常的位(除了分频和右移)。例如:

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的定义)。所以它归结为,至少对于加法/减法/乘法/左移,是简单的无符号算术 - 你只是以不同的方式打印数字。当然,一些运营商仍需要特殊的签名版本。由于它与无符号算术如此接近,因此您可以推断加法和乘法,就好像您在Z / 2 ^ k Z中一样具有完全置信度。它确实具有与负零的存在相当的轻微奇怪性,即存在没有正绝对值的负数。

答案 1 :(得分:2)

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

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

维基百科中签名的数字表示文章comparison tables说明了带符号的幅度,2的补码,以及从-11到+16的十进制数字行中的三个其他值表示系统以及二进制值图表从0000到1111。