32位有符号整数的最小值是多少?

3
为什么最小值不像这样:
11111111 11111111 11111111 11111111

请帮我理解这个。


2
他的问题其实很清楚。 - Maroun
http://en.wikipedia.org/wiki/Two%27s_complement - luser droog
使用unsigned获取最大值 - Sadique
4个回答

4
11111111 11111111 11111111 11111111
↑
MSB is 1 indicating that the number is negative

实际上是-1。为什么?

要计算一个数字的补码,你需要将所有位取反后再加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
那么对于不使用二进制补码的系统或架构呢? - Sadique
2
@al-Khwārizmī 我其实不太确定.. 更希望有懂的人来回答你。 - Maroun
1
@al-Khwārizmī - 由于 -2 < -1 这意味着 "11111111 11111111 11111111 11111111" 是可以在4字节中表示的最小负数(同时也是最大正数)。...尽管楼主自己说的是32位有符号数。 - Grijesh Chauhan

2
考虑到每个位的“位值”,这是一个很好的例子。出于空间考虑,让我们暂时考虑一个8位带符号整数,它的取值范围在-128和+127之间。
这个整数中每个位的位值从最低有效位到最高有效位分别是:
+1(LSB) +2 +4 +8 +16 +32 +64(MSB) -128(符号位)
这意味着最高值表示为01111111 (+127),最低值表示为10000000 (-128)。 11111111表示-1。
相同的原则适用于32位带符号整数,只是具有更大的位值(特别是符号位为-2147483648)。

2

让我们使用一个3位的例子来简化问题。

将值0表示为3位二进制数是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的补码,并被查尔斯·巴贝奇用于在他的差分机中表示负数。

1
在有符号整数中,最高位表示符号,1=-ve, 0=+ve
因此,机器实际上将它们存储在范围0x00000000 - 0xffffffff内。
但由于它是signed,必须包括正数和负数,因此解释将其更改为[-0x0fffffff + 1, 0x0fffffff][0x10000000,0x0fffffff]

该范围均匀分割-[-2^31,2^31-1]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接