解决java定义long类型却内存溢出的问题

解决java定义long类型却内存溢出的问题

首先看一下int和long类型的内存占用

 占用字节数占用位数取值范围约等于
int 4 32 -2^31~2^31-1 -21亿~21亿
long 8 64 -2^63~2^63-1 ...

由int类型取值范围可知,如果把超过21亿的值赋值给int类型,则会出现内存溢出

int a = 1000000000;
int b = 20;
int c = a * b;
System.out.println(a);//输出1000000000
System.out.println(b);//输出20
System.out.println(c);//输出-1474836480,内存溢出导致结果不正确

那么如果把int c改为long c,是否就不会出现内存溢出问题?

int a = 1000000000;
int b = 20;
long c = a * b;//修改int c为long c
System.out.println(a);
System.out.println(b);
System.out.println(c);

可以看到把int c改为long c,得到的是一样的结果。

原因是:a和b都是int类型,所以a*b计算的时候会默认将结果转换为int,即使最后赋值给long,此时计算结果已经是错误的了。

解决方案:把a*b计算表达式中任意一个变量转换为long类型。

int a = 1000000000;
int b = 20;
long c = a * b;
long d = (long)a * b;
long e = a * (long)b;
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
System.out.println("d=" + d);
System.out.println("e=" + e);

结论:如果表达式两边参数类型一致,则计算时会默认产生该类型的结果,而不是按照最终赋值的参数类型计算。

 

posted @ 2021-01-16 23:03  榛子岑  阅读(1202)  评论(0)    收藏  举报