为什么Java integer中的整数不使用所有32位或64位?
我正在研究32位和64位。我注意到可以存储在32位的整数值的范围是为什么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的签名类型。对于
±4294967295
,但是Javaint
也是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
- 一,
- 二,
- 三,
- -四,
- -三,
- -二,
- -一,
这个序列形成了一个“轮子”,每一个轮子都是在前一个轮子的基础上加上一个轮子而形成的,并标注了从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位。