long a = 2 * 1024 * 1024 * 1024;
System.out.println(a);
这两句代码的输出是什么呢?大家可能觉得很简单,就是简单的乘法,用计算器算一下结果应该为:2147483648
但是实际运行结果却是:
-2147483648
这是为什么呢?
很明显这是数值溢出了,但是long是64位的,其最大值为2的63次方-1=9,223,372,036,854,775,807。现在这个正确的结果远没有达到上限,为什么会溢出呢?
原来,java在执行乘法运算时,默认是用int来计算的,1024 * 1024 * 1024的值为:
0100 0000 0000 0000 0000 0000 0000 0000
这个时候在乘2,相当向左移动一位得到的值为:
1000 0000 0000 0000 0000 0000 0000 0000
int类型是四个字节的,这个时候已经产生了溢出,变成了int类型的最小值了。
要解决这个问题其实也很简单,只要注明被乘数的类型为long就可以了,代码改为:
long a = 2L * 1024 * 1024 * 1024;
System.out.println(a);