13

抱歉,如果这是一个非常基本的问题,但为什么正面有一个减号?

它与存储的零有关吗?我认为为二进制计算可能的最高十进制数只是将两个的幂相加,例如对于 3 位无符号数

1*2^0 + 1*2^1 + 1*2^2 = 7

相同的规则不应该适用于 java 整数吗?谢谢

4

7 回答 7

15

因为 Java 可以支持最大带符号整数,0x7fffffff即 2^31-1。

2^31 = 0x80000000 is negative so Positive is 2^31-1

二进制级别比较将是:

10000000000000000000000000000000  --> 2147483648 --> 2^31
01111111111111111111111111111111  --> 2147483647 --> 2^31 -1
^ Sign bit
于 2012-10-12T20:26:04.793 回答
7

同样的规则也适用……72^3 - 1。是的,这是因为 0。:)

相比之下,否定去-(2^31)

所以有2^31负数、一02^31-1严格的正数,它们增加了......

2^31 + 1 + 2^31 - 1 = 2 * 2^31 = 2^32
于 2012-10-12T20:24:12.523 回答
6

这是因为二进制补码的便利性(避免存储两个零),Java 使用这种表示形式存储数字。看看这里

于 2012-10-12T20:25:53.010 回答
5

有从到的2^31非负数。所以,是的,也存储为整数。而且,还有从到的负数。02^31-1zero2^31-2^31-1

于 2012-10-12T20:25:14.597 回答
2

它必须拆分 2^32。
1/2 为负数。
0 计为阳性。
在数学中,0 既不是负数也不是正数。
它在 .NET 和 MSSQL 中是一致的。

如果您注意到不包含负数的集合称为无符号集合。
它包含 0,不适合称其为正数。
由于二进制世界从 0 开始,因此它被视为正数。
Jack (+1) 的回答说明了原因。

于 2012-10-12T20:24:24.847 回答
1

如果您有 n 位,则您有 2^(n-1) 个负数(因为最高位是 1)和 2^(n-1) 个非负数。由于零是非负数,因此您最多有 2^(n-1)-1 个正数,这也是最大值。

注意:最负数没有正数,所以

-Integer.MIN_VALUE == Integer.MIN_VALUE
于 2012-10-12T20:25:33.883 回答
0

Java 整数是有符号的数量,因此为符号保留一位,为值保留 31 位。

于 2012-10-12T20:29:41.320 回答