为什么java中的最大整数是2^31-1而不是2^31

为什么java中的最大整数是2^31-1而不是2^31,java,memory,integer,Java,Memory,Integer,抱歉,如果这是一个非常基本的问题,那么为什么正面会有一个负一呢 这和零被存储或其他什么有关吗?我认为计算二进制可能的最高十进制数只需将2的幂加起来,就像3位无符号数字一样 1*2^0 + 1*2^1 + 1*2^2 = 7 同样的规则不应该适用于java整数吗?谢谢同样的规则也适用于7是2^3-1。是的,这是因为0。) 相反,负片则指向-(2^31) 所以这里有2^31负数,一个0,还有2^31-1严格的正数,它们增加了 2^31 + 1 + 2^31 - 1 = 2 * 2^31 = 2^3

抱歉,如果这是一个非常基本的问题,那么为什么正面会有一个负一呢

这和零被存储或其他什么有关吗?我认为计算二进制可能的最高十进制数只需将2的幂加起来,就像3位无符号数字一样

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

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

同样的规则也适用于<代码>7是
2^3-1
。是的,这是因为0。)

相反,负片则指向
-(2^31)

所以这里有
2^31
负数,一个
0
,还有
2^31-1
严格的正数,它们增加了

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

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

如果您注意到不包含负片的集合称为unsigned。
它包含0,因此不宜称之为正数。
由于二进制世界从0开始,因此它被视为正数。

杰克(+1)的答案有其原因。

2^31
非负数,范围从
0
2^31-1
。因此,是的,
zero
也存储为整数。此外,还有从
-2^31
-1
不等的
2^31
负数,如果有n位,则有2^(n-1)个负数(顶部位为1)和2^(n-1)个非负数。因为零是一个非负数,所以最多有2^(n-1)-1个正数,这也是最大值

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

-Integer.MIN_VALUE == Integer.MIN_VALUE

这是因为二的补码方便(避免存储两个零),Java使用这种表示法存储数字。看一看。

因为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

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

因为;见相关问题:不清楚你在问什么。我们做的是“只需将二的幂相加”,在你的例子中,你做的是1+2+4,与2^3-10相同,不被认为是正数,只是为了方便起见,它被插入到二的补码中的正数之间。@NullUserException你是对的,我只是维基了它并更新了我的答案。谢谢,这让它变得更加清晰了“有符号位”应为“有符号位”