为什么不是这样的最小值:
11111111 11111111 11111111 11111111
请帮助我理解这一点。
答案 0 :(得分:4)
11111111 11111111 11111111 11111111
↑
MSB is 1 indicating that the number is negative
实际上是-1。为什么呢?
要计算数字的two's complement,请翻转所有位并添加1.按照您建议的数字执行此操作:
00000000 00000000 00000000 00000001
哪个是1,但标志是否定的。所以你得到-1。
您可能想尝试:
10000000 00000000 00000000 00000000
如果您计算上述数字,您将获得:
01111111 11111111 11111111 11111111 flip
00000000 00000000 00000000 00000001 + add 1
-----------------------------------
10000000 00000000 00000000 00000000
这确实是最小值。
答案 1 :(得分:2)
根据每个位的“位置值”来考虑这一点。为了空间,我们暂时考虑一个8位有符号整数,其值可以在-128到+127之间。
此整数中每个位的位置值从最小到最重要:
这意味着最高值表示为01111111
(+127),最低值表示为10000000
( - 128)。 11111111
代表-1。
同样的原理适用于32位有符号整数,只有较大的位值(具体来说,符号位为-2147483648)。
答案 2 :(得分:2)
让我们使用一个3位示例来保持简单。
表示为3位二进制数的值0
为000
。
如果我们从1
中减去0
,我们会得到-1
。如果我们从1
中减去000
,我们会得到111
借用“掉线”,因为我们只有3位。
如果我们继续减1,我们得到:
-1 111
-2 110
-3 101
-4 100
如果我们从0
开始并添加1
,我们会得到正数:
+1 001
+2 010
+3 011
但是当我们尝试添加另一个1
时,我们会得到-4
的代表而不是+4
。
这就像你试图将里程表收回车上时会发生的情况。一旦你达到0,下一个数字将是9999999(或者里程表上有许多数字),但这自然可以被认为是-1的表示。当你再往后走时,这个数字将会远离所有9个,但它会代表更多的负值。我们可以说,如果最左边的数字介于0和4之间,则数字为正数,如果数字介于5和9之间,则为负数。随着我们继续倒退,我们最终将达到5000000,这是最负面的价值。再次回绕会导致溢出,因为我们得到4999999,我们认为这是正数(最正值)。顺便提一下,这被称为10的补码,并被Charles Babbage用来表示他的差异引擎中的负数。
答案 3 :(得分:1)
在有符号整数中,MSB代表符号1
= -ve
,0
= +ve
。
因此,机器实际上将它们存储在0x00000000 - 0xffffffff
范围内
但由于它是signed
,因此必须同时包含正数和负数,因此解释会将其更改为[-0x0fffffff + 1, 0x0fffffff]
或[0x10000000,0x0fffffff]
签名语言。
范围均匀分割 - [-2^31,2^31-1]