java 整数 范围_探究JAVA整数的取值范围

查看JAVA的Integer.MAX_VALUE和Integer.MIN_VALUE可知,在JAVA中,整数的取值范围是0x8000000到0x7FFFFFFF之间。1ab094952d3301374ed0803c26c8d62e.pngJAVA Integer

网上很多文章说都直接解释说因为int是32位,1位用来保存正负,剩下的31位用来保存数值,所以最大值是231-1,最小值是231

但是究竟为什么是这两个数,却几乎没人往下面解释了。这么解释未免有些过于片面。

对于JDK来说(或者JVM),是区分32位和64的,但是对于JAVA语言来说,是不区分32位和64位的,因为JAVA语言可以写出32位的程序也可以写出64位的程序,完全看编写JAVA代码的程序员是如何编写的。程序编写完成后,打包运行时,有可能运行在64的机器上,也有可能运行在32位的机器上,如果编写的是32位的程序,那么运行在32位或者64位的系统上都没有问题,但是如果编写的是64位的程序,运行在32位的系统上,就会出现问题。所以JAVA语言就直接把位数限制在32位,保证最终程序运行在32位/64位的系统上都没问题(这里只针对整数)。

再来到CPU层面,众所周知,一切要程序要运算的数据,CPU在进行计算时,会先进行内存寻址,然后将内存中需要计算的数据存放到CPU的通用寄存器中,32位的CPU的寄存器最多可以存放32位的数据,64位的CPU的寄存器最多可以存放64位的数据,对于CPU来说,如果JAVA把整数的位数定位64位,在32位的CPU上就无法进行运算。所以,还是那句总结,JAVA语言就直接把位数限制在32位。

然后再说为什么整数的取值范围是 -231到231-1。首先,32位中,最后一位(第31位)用来表示正负,0表示正,1表示负。剩下的31位用来表示数据。

31位二进制数,最大值就是31个1,也就是231-1,这时候,最后一位(第31位)是0,就表示正231- 1,最后一位(第31位)是1,就表示负231 - 1。但是这样会出现一个问题,当31位数据都是0的时候,如果最后一位是0,那就是0,但如果最后一位是1,就表示负0,在世界上当然没有负0这个东西,所以不能这样进行数据计算。

补码,于是,不知道是科学家还是数学家还是什么家就提出了补码的概念。首先,最高位为9,数据位从0到231 - 1,这样表示0到231 - 1的正整数,这样是没有问题的。然后用它们按位取反再加1,得出来的数用来表示负数。

栗子:

十进制0   0x 0000 0000  按位取反  0x FFFF FFFF  + 1 = 0x 0000 0000  (十进制0)

十进制1   0x 0000 0001  按位取反  0x FFFF FFFE  + 1 = 0x FFFF FFFF   (十进制-1)

十进制2   0x 0000 0002  按位取反  0x FFFF FFFD  + 1 = 0x FFFF FFFE  (十进制-2)

十进制231- 1  0x 7FFF FFFF 按位取反 0x 1000 0000 + 1 = 0x 1000 0001 (负231 - 1)

由此,我们可以得出,在补码的方案中,有以下两条结论:

(1)最高位为1,表示负数

(2)正数的补码按位取反加1,为其对应的负数。也可以推断出,负数的补码按位取反加1,得到其绝对值。栗子:-1的补码为:0xFFFF FFFF 取反后为 0x 0000 0000,加1为 0x 0000 0001,也就是十进制1 ,也就是其绝对值。

由以上两条特性,我们可以得出,计算负数的值时,可以计算其绝对值,然后加上负号,就得到了正确的值。

然后我们来计算一下 0x 8000 0000的值,首先 0x 8000 0000 按位取反得到 0x 7FFF FFF, 然后加1 得到 0x 8000 0000,也就是2的31次方,给其加上负号就是 -231,因此我们得出 0x 8000 0000的值就是 负2的31次方。

综上所述,我们可以得出根据补码的规定,32位的条件下,整数的取值范围是 -231 到 231 - 1 。5a6248719eab539b6cda4d7ca48f5a7b.png

如果发现有错误的地方,请留言指出。

欢迎访问我的个人网站:www.junglesay.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值