为什么Java integer中的整数不使用所有32位或64位?

为什么Java integer中的整数不使用所有32位或64位?,java,64-bit,32-bit,twos-complement,Java,64 Bit,32 Bit,Twos Complement,我正在研究32位和64位。我注意到可以存储在32位的整数值的范围是±4294967295,但是Javaint也是32位的(如果我没有弄错的话),它存储的值最多为±2147483648。对于long,它存储0到±2^63之间的值,但64位存储±2^64值。为什么这些值不同?在32位中,您可以存储2^32个值。如果将这些值0调用到4294967295或将-2147483648调用到+2147483647,则由您决定。这种差异称为“有符号类型”与“无符号类型”。Java语言只支持int的签名类型。对于

我正在研究32位和64位。我注意到可以存储在32位的整数值的范围是
±4294967295
,但是Java
int
也是32位的(如果我没有弄错的话),它存储的值最多为
±2147483648
。对于
long
,它存储
0到±2^63
之间的值,但64位存储
±2^64
值。为什么这些值不同?

在32位中,您可以存储2^32个值。如果将这些值0调用到4294967295或将-2147483648调用到+2147483647,则由您决定。这种差异称为“有符号类型”与“无符号类型”。Java语言只支持
int
的签名类型。对于无符号32位类型,其他语言有不同的类型


laguage的±4294967295将有一个32位类型,因为“-”部分需要另一位。

这是因为Java
int
s是有符号的,所以需要一位作为符号。

Java中的整数是有符号的,所以保留一位来表示数字是正还是负。这种方法调用表示法,由n位表示的最大正值由

(2^(n-1))-1

相应的最小负值由下式给出:

-(2^(n-1))

正边界和负边界的“关闭一”方面是由于零。零占据一个位置,留下偶数个负数和奇数个正数。如果你把代表的值画成一个圆圈上的标记,比如钟面上的小时,你会发现零属于正范围,而不是负范围。换句话说,如果你把零算成正数,你会发现在正负值范围内更对称

要学习此表示法,请从小处开始。比如说,取三位,写出所有可以表示的数字:

  • 0
  • 一,
  • 二,
  • 三,
  • -四,
  • -三,
  • -二,
  • -一,
你能写出定义这些数字的三位序列吗?一旦你明白了怎么做,再多尝试一点。从这里,您可以想象它是如何扩展到32或64位的


这个序列形成了一个“轮子”,每一个轮子都是在前一个轮子的基础上加上一个轮子而形成的,并标注了从3到-4的环绕。这种环绕效应(减法也可能出现)被称为

如果你想让排序“开箱即用”,你必须使用带符号的范围。非常感谢你解释它是如何工作的。我现在明白了:)。我个人一直认为把它看作一个多项式
b{n-1}*2^{n-1}+b{n-2}*2^{n-2}+b{0}*2^0
带有b的0或1,n=字宽。有符号和无符号的区别就在于第一项是否为负。很好的解释,@Voo。一个更容易理解但不太正式的定义是,如果高位为1,那么8位数字的值为-128,其余位的含义不变。这就解释了为什么
11111111
是-1;它相当于
01111111
,或127加-128。同样,与您的定义相同,但意味着不太可能混淆乘法。顺便说一句,我很欣赏TeX符号。@seh-Yup,你基本上是在用一种非正式的方式描述正式定义-当然,除了最喜欢数学的人之外,任何人都更容易理解。。这就是为什么我会成为一个糟糕的老师;)您可以使用Java的有符号原语来存储无符号值。Java不提供对此的支持,但通过一些(通常是次要的解决办法)它就可以正常工作。显然,在支持无符号类型的语言中,不需要这些变通方法。要存储2^64个负值和2^64个正值,需要存储2*2^64或2^65或65位的内容。要存储2^63个负值和非负值,需要2*2^63或64位。