Java问题总结之1-2--超出数据类型取值范围

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


为了更详细的看出其变化,将在临界值前后输出更多值,测试2:
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  


 
 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值