[java,2017-05-17] 数据型参数趣谈

int的最大值是多少?加一呢?乘2呢?

第一个问题我想大多数人都知道,不知道后两个有多少人研究过。

首先上一段代码:

 1 public class DecimalTest {
 2     public static void main(String[] args) {
 3         System.out.println("int==============");
 4         int int_max=Integer.MAX_VALUE;
 5         int int_min=Integer.MIN_VALUE;
 6         System.out.println(("int_max==="+int_max));
 7         System.out.println(("int_max+1==="+(int_max+1)));
 8         System.out.println(("int_min==="+int_min));
 9         System.out.println(("int_min-1==="+(int_min-1)));
10         System.out.println(("int_max*2==="+int_max*2));
11         System.out.println(("int_min*2==="+int_min*2));
12         
13            
34     }
35 }

运行结果

int==============
int_max===2147483647
int_max+1===-2147483648
int_min===-2147483648
int_min-1===2147483647
int_max*2===-2
int_min*2===0

我们可以看到,int的最大值加一后变为了最小值,乘2后变为了-2;同时int的最小值减一后变为了最大值,乘2后变为了0。

这是因为int_max的值用二进制表示为 01111111111111111111111111111111,加一为 10000000000000000000000000000000,

而10000000000000000000000000000000正是int_min的二进制的补码形式。

所以最大值加一就变为了最小值,最小值减一就变为了最大值。

此外,还有其他的数据类型short、long与此相同。

     System.out.println("short=============");
        short short_max=Short.MAX_VALUE;
        short short_min=Short.MIN_VALUE;
        System.out.println(("short_max==="+short_max));
        System.out.println(("short_max+1==="+(short_max+1)));
        System.out.println(("short_min==="+short_min));
        System.out.println(("short_min-1==="+(short_min-1)));
        System.out.println(("short_max*2==="+short_max*2));
        System.out.println(("short_min*2==="+short_min*2));
        
        long long_max=Long.MAX_VALUE;
        long long_min=Long.MIN_VALUE;
        System.out.println(("long_max==="+long_max));
        System.out.println(("long_max+1==="+(long_max+1)));
        System.out.println(("long_min==="+long_min));
        System.out.println(("long_min-1==="+(long_min-1)));
        System.out.println(("long_max*2==="+long_max*2));
        System.out.println(("long_min*2==="+long_min*2));
        

还有与此不同的float、double类型

     System.out.println("float=============");
        float float_max=Float.MAX_VALUE;
        float float_min=Float.MIN_VALUE;
        System.out.println(("float_max==="+float_max));
        System.out.println(("float_max+1==="+(float_max+1)));
        System.out.println(("float_min==="+float_min));
        System.out.println(("float_min-1==="+(float_min-1)));
        System.out.println(("float_max*2==="+float_max*2));
        System.out.println(("float_min*2==="+float_min*2));
        System.out.println(("float_min/2==="+float_min/2));
        
        System.out.println("double=============");
        double double_max=Double.MAX_VALUE;
        double double_min=Double.MIN_VALUE;
        System.out.println(("double_max==="+double_max));
        System.out.println(("double_max+1==="+(double_max+1)));
        System.out.println(("double_min==="+double_min));
        System.out.println(("double_min-1==="+(double_min-1)));
        System.out.println(("double_max*2==="+double_max*2));
        System.out.println(("double_min*2==="+double_min*2));
        System.out.println(("double_min/2==="+double_min/2));

结果

float=============
float_max===3.4028235E38
float_max+1===3.4028235E38
float_min===1.4E-45
float_min-1===-1.0
float_max*2===Infinity
float_min*2===2.8E-45
float_min/2===0.0
double=============
double_max===1.7976931348623157E308
double_max+1===1.7976931348623157E308
double_min===4.9E-324
double_min-1===-1.0
double_max*2===Infinity
double_min*2===1.0E-323
double_min/2===0.0

加一没有变化,乘2得到一辆英菲尼迪(Infinity)。

加一没有变化是因为浮点数的计算不是精确的,当2个数字相差极大时,小的数字会被忽略(个人看法、没有求证,不太确定);

乘2得到无穷的具体原因就不知道了。

原文地址:https://www.cnblogs.com/shijt/p/9050263.html