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

来源:互联网 发布:网络协议怎么设置 编辑:程序博客网 时间:2024/06/06 08:38

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);}}}
输出结果:

248163264128256512102420484096819216384327686553613107226214452428810485762097152419430483886081677721633554432671088641342177282684354565368709121073741824-214748364800


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

测试结果:

214748364221474836432147483644214748364521474836462147483647-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);}}
输出结果为:
05764607523034234885.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  


0 0