2012-10-12 64 views
11

对不起,如果这是一个非常基本的问题,但为什么有一个负值的正面呢?为什么java中的最大整数是2^31 - 1而不是2^31

它是否与存储零或什么?我想计算二进制尽可能高的十进制数也只是补充的两个大国了,像一个3位无符号这将是

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

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

+1

由于[二补](http://en.wikipedia.org/wiki/Two's_complement);看到相关的问题:http://stackoverflow.com/questions/3809044/how-many-values-can-be-represented-with-9-bits/3809058#3809058 – NullUserException

+0

上帝的母亲,第一次张贴到一个Java标记和有很多回应,谢谢大家! –

回答

12

因为Java可以支持max signed int作为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 
+0

谢谢,这使得它更清楚 –

+1

“有符号位”应该是“符号位” – Roland

6

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

相比之下,底片去-(2^31)

因此,有2^31负数,一个0,并且2^31-1严格阳性,其中添加到...

2^31 + 1 + 2^31 - 1 = 2 * 2^31 = 2^32 
2

它必须分裂2^32。
1/2是否定的。
0与积极的计数。
数学0既不是负数也不是正数。
它在.NET和MSSQL中是一致的。

如果您注意到不包含底片的组称为无符号。
它包含0,并不适合称它为正。
由于二元世界从0开始,它被认为是正面的。
杰克(+1)的答案有原因。

+1

0不被视为正数,只是为了方便起见,它被插入到二进制补码中的正数之间。 – Jack

+0

@NullUserException你是对的,我只是维基和更新我的答案。 – Paparazzi

3

2^31非负数范围从02^31-1。所以,是的,zero也存储为一个整数。此外,还有2^31负数,范围从-2^31-1

1

如果您有n位,则有2 ^(n-1)个负数(顶部位为1)和2 ^(n-1)个非负数。由于零是一个非负数,所以你有多达2 ^(n-1)-1的正数,这也是最大的。

注:有没有积极为最负值,这样

-Integer.MIN_VALUE == Integer.MIN_VALUE 
5

这是因为的便利性(从而避免了存储两个零),并使用rapresentation Java的店号。看看here

0

的Java整数签订量,所以一个位保留为标志,留下31位的值。

相关问题