今天java开发中发现了一个很神奇的问题
long的乘法溢出
java中,long的表示范围绝对值是2的63次方-1
如下:
1、
基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)
2、
基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768 (-2的15此方)
最大值:Short.MAX_VALUE=32767 (2的15次方-1)
3、
基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)
可是在开发过程中,却发生了溢出
然后改成5,却不溢出了
改成4,是-1.原因是为什么呢?
是因为右边的表达式,在102410241024*2是2的31次方-1,正好是int的表示范围,右边表达式默认按照int来,先Int计算,再转换为long.
所以我们将乘数表示为long,即在后面加上L标志,如图所示,就不会溢出了
结论,要记得左右类型的处理。
“long数据类型是64位有符号的Java原始数据类型。当对整数的计算结果可能超出int数据类型的范围时使用。
long数据类型范围内的所有整数称为long类型的整数字面量。long类型的整数常数总是以大写L或小写l结尾。”
参考文章:
https://blog.csdn.net/qfikh/article/details/52832087
https://blog.csdn.net/qq_16064871/article/details/83032719