Java中Integer的最大值和最小值

Java中Integer的最大值和最小值

链接:

今天面试同事问了一个面试问题,java 最大值最小值是怎么算出来的。这个问题有些同事说也不清楚,所以列一下。

从JDK1.0开始,中就定义了和MAX-VALUE两个常量:

/**
 * A constant holding the minimum value an {@code int} can
 * have, -231.
 */
public static final int   MIN_VALUE = 0x80000000;

/**
 * A constant holding the maximum value an {@code int} can
 * have, 231-1.
 */
public static final int   MAX_VALUE = 0x7fffffff;

第一个问题

谁能给解释一下,这两个常量为什么会分别定义成和。

在这里直接能看到这个数值,突然一看对于最大值还是能理解的,但是对于最小值就不是很理解了。

一般能在网上看到这段话

四字节的整形 有符号是 -2^31 ~ 2^31-1 ;在计算机内部数值的二进制表示,有正码、反码和补码。一般采用二进制补码进行表示和运算, = 和 = 就是补码表示的的最小值(-2^31) 和最大值(2^31-1)。至于的最大值最小值为什么是这两个数,这是因为Java语言规范规定int型为4字节,不管是32/64位机器,这就是其所宣称的跨平台的基础部分.

原码、反码、补码之间的相互关系

1、10001的补码是取反后在再加1java integer最大多少,也就是11110+1=11111;

2、如果是11111变回原码呢?我们可以采取逆过程先减1,11111-1=11110,再取反变为10001;

3、如果要是在补码变原码时先去反再加一呢?(就是问题中的说法)结果为11111先取反为10000,再加1,10000+1=10001。这个结果与2是一样的,并且也是和1中的原码相吻合。

在取反前减1和在取反后加1的效果是一样的。这就和-3-1=-(3+1)是一个道理。

计算机保存最原始的数字,也是没有正和负的数字,叫没符号数字

如果我们在内存分配4位(bit)去存放无符号数字java integer最大多少,是下面这样子的

后来在生活中为了表示“欠别人钱”这个概念,就从无符号数中,划分出了“正数”和“负数”

正如上帝一挥手,从混沌中划分了“白天”与“黑夜”

为了表示正与负,人们发明了”原码”,把生活应该有的正负概念,原原本本的表示出来

把左边第一位腾出位置,存放符号,正用0来表示,负用1来表示

但使用“原码”储存的方式,方便了看的人类,却苦了计算机

我们希望 (+1)和(-1)相加是0,但计算机只能算出0001+1001=1010 (-2)

这不是我们想要的结果 (╯’ – ‘)╯︵ ┻━┻

另外一个问题,这里有一个(+0)和(-0)

为了解决“正负相加等于0”的问题,在“原码”的基础上,人们发明了“反码”

“反码”表示方式是用来处理负数的,符号位置不变,其余位置相反

当“原码”变成“反码”时,完美的解决了“正负相加等于0”的问题

过去的(+1)和(-1)相加,变成了0001+1101=1111,刚好反码表示方式中,1111象征-0

人们总是进益求精,历史遗留下来的问题—— 有两个零存在,+0 和 -0

我们希望只有一个0,所以发明了”补码”java integer最大多少,同样是针对”负数”做处理的

“补码”的意思是,从原来”反码”的基础上,补充一个新的代码,(+1)

我们的目标是,没有蛀牙(-0)

有得必有失,在补一位1的时候,要丢掉最高位

我们要处理”反码”中的”-0″,当1111再补上一个1之后,变成了10000Java中Integer的最大值和最小值,丢掉最高位就是0000,刚好和左边正数的0,完美融合掉了

这样就解决了+0和-0同时存在的问题

另外”正负数相加等于0″的问题,同样得到满足

举例,3和(-3)相加,0011 + 1101 =10000,丢掉最高位,就是0000(0)

同样有失必有得,我们失去了(-0) , 收获了(-8)

以上就是”补码”的存在方式

结论:保存正负数,不断改进方案后,选择了最好的”补码”方案

再看

那么在计算机中其实是用做补码进行表示和运算的,使用补码不仅仅修复了0符号以及存在两个编码的问题,而且还能够多表示一个最低数,这也就是8位二进制数表示的范围为

-127,+127

,而使用补码表示的范围为

例如有:

(-1)+ (-127) =

1000 0001

原 +

1111 1111

原 =

1111 1111

补 +

1000 0001

补 =

1000 0000

-1-127的结果应该是-128,在用补码运算的结果中,

1000 0000

补 就是-128,但是注意因为实际上是使用以前的-0补码来表示-128,所以-128并没有原码和反码表示。(对-128的补码表示

1000 0000

补算出来的原码是

0000 0000

原,这是不正确的)

那么类似的对于32位而言,

int类型能表示的最小负数

最小的负数的二进制码是1 0 0000 0000 ,补码还是这个值,所以最小值为-2^31

int类型能表示的最大正数

最大正数是毫无疑问,所以还是0 1 1111 1111,也是2^31 – 1

重要的性质最小值-1

最小值的二进制补码表示 1 0 0000 0000 ,减1后称为0 1 1111 1111是最大的正数

重要的性质最大值+1

最大值的二进制补码表示 0 1 1111 1111,加1后称为 1 0 0000 0000

第二个问题

java.lang.的最大长度是多少?

的最大长度取决于其内部数据表示。内部是通过char数组表示,数组的长度在Java中限制为一个int型所能表示的最大值,即Q1中的 = 。这点通过其内部表示偏移量int 和长度int count的属性可以体现。

第三个问题

如下代码能抛出异常吗?为什么

int x = Integer.MAX_VALUE+10;
if(x >= Integer.MAX_VALUE || x <= Integer.MIN_VALUE){ 
   throw exception
}

上述代码不会抛出异常, .+1 溢出后为 ., 因此.+10 相当于.+9;

顺便提一句对于超出表示范围的数值,即超过32位采取的策略是截断效应,即直接截取低位,抛弃超出范围的高位信息,这就是所谓的溢出。例如int型的运算结果若超出表示范围,则直接截取低32位(Q1中4个字节)作为运算结果。

一个死循环的例子

这段代码是会陷入死循环的,就死在了for里面。

for(int i=0;i<=Integer.MAX_VALUE;i++){

   temp=i;

}

只有当i比int最大值大的时候才能结束循环Java中Integer的最大值和最小值,可问题是……

i本身就是int类型的,它怎么可能比int的最大值还大!!!

for循环运行到 i = . ,即 i = ,i再加1,就变成了-

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » Java中Integer的最大值和最小值

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们