Java问题总结:
问题1.超出数据类型取值范围:
数据类型:int
取值范围:-2^31--2^31-1
测试1:
package p1;
public class test {
public static void main(String[] args) {
int i3 = 1;
for (int i=1;i<34;i++){
i3=i3*2;
System.out.println(i3);
}
}
}
输出结果:
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
-2147483648
0
0
package p1;
public class test {
public static void main(String[] args) {
int i3=1;
for (int i=1;i<31;i++){
i3=i3*2;
}
int k=0;
for(int j=(i3-3)*2;k<15;j++,k++){
System.out.println(j);
}
}
}
测试结果:
2147483642
2147483643
2147483644
2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646
-2147483645
-2147483644
-2147483643
-2147483642
-2147483641
-2147483640
分析:当前int型数据达到最大值2147483647时,是第一位为0,其余31位为全1,01111111111111111111111111111111;再加1则进1,第一位为0,其余全零,10000000000000000000000000000000。系统把第一位判断为负号,而且同时代表值,所以是-2147483648,当再继续相加时,系统会把之前的数当做负数,再加上正数1,则为-2147483647,10000000000000000000000000000001,后面以此类推。结合测试1,当为10000000000000000000000000000000时,即2147483648,再乘以2将溢出,溢出位娶不到,全0,即为00000000000000000000000000000000,此时为0(-2147483648再乘以2为什么是0的理解) . 再乘以2依然为0.
(上面为自己理解,不一定对,欢迎更正!)
问题2.将long赋值给float:
因为long是64位,而float为32位,有效位数为15位,将long型数据给float时是自动转换,不用强制转换,但是会有精度损失。
测试:
package p1;
/**
* This is document explain
* @author xubo601450868
* @version v1.0
* @since v1.0
* test
* */
public class test2 {
public static void main(String[] args) {
long l3=1L;
int i3=1;
for (int i=1;i<60;i++){
l3=l3*2;
i3=i3*2;
}
float f3 =l3;
System.out.println(i3);
System.out.println(l3);
System.out.println(f3);
}
}
输出结果为:
0
576460752303423488
5.7646075E17
i3为0在上面问题1中已经总结,
576460752303423488对于long型来说依然没有溢出,而自动转换为float型数据时会存为科学计数法,所以损失的很小。float是浮点数,与整数存储机制不一样,所以存储的最大值也不一样。
环境:
<pre name="code" class="plain">系统:win8.1 64位
IDE:eclipse Version: Mars Release (4.5.0)
JDK:version 1.7.0_79