【发布时间】:2014-03-19 06:58:36
【问题描述】:
为什么不是这样的最小值:
11111111 11111111 11111111 11111111
请帮助我理解这一点。
【问题讨论】:
为什么不是这样的最小值:
11111111 11111111 11111111 11111111
请帮助我理解这一点。
【问题讨论】:
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
这确实是最小值。
【讨论】:
-2 < -1 表示“11111111 11111111 11111111 11111111”将是最小的负数(以及最大正数),可以用 4 字节表示。 ...虽然 OP 自己说的是 32 位有符号数。
让我们用一个 3 位的例子来保持简单。
表示为 3 位二进制数的值 0 是 000。
如果我们从0 中减去1,我们得到-1。如果我们从000 中减去1,我们会得到带有“脱落”的借位的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 用它来表示他的差分引擎中的负数。
【讨论】:
根据每个位的“位值”来考虑这一点。为了篇幅,让我们暂时考虑一个 8 位有符号整数,它的值可以在 -128 和 +127 之间。
这个整数中每一位的位置值,从最低到最高:
这意味着最大值表示为01111111 (+127),最小值表示为10000000 (-128)。 11111111 代表-1。
同样的原则适用于 32 位有符号整数,只是位值更大(特别是符号位为 -2147483648)。
【讨论】:
在有符号整数中,MSB 代表符号1=-ve、0=+ve。
所以,机器实际上将它们存储在0x00000000 - 0xffffffff范围内
但由于它是signed,它必须同时包含正数和负数,因此解释将其更改为[-0x0fffffff + 1, 0x0fffffff] 或[0x10000000,0x0fffffff] 手语。
范围均分 - [-2^31,2^31-1]
【讨论】: