解决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);

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

浙公网安备 33010602011771号