问题背景
今天在写代码时,将之前的一个变量进行了修改,运行单测的时候发现单测跑不过了,有点疑惑:
原代码简化下:
count = 123;
Long MAX_SIZE = 3 * 1024 * 1024 * 1024L;
if (count > MAX_SIZE) {
do error 逻辑
}
修改后的代码:
count = 123;
long MAX_SIZE = 3 * 1024 * 1024 * 1024;
if (count > MAX_SIZE) {
do error 逻辑
}
做此次修改主要是避免每次都拆装箱,结果修改后,if 条件变为了true,执行到了 异常流的处理逻辑。
原因
java中的整型默认为int, 3 * 1024 * 1024 * 1024 超过了 int 的最大值(2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647),导致溢出变为了 -1073741824,所以出现了上面的问题。
知识点
java中的整型默认为int,int转为long是安全的,所以会自动转,能编译通过。
浮点数不加F默认是double类型,double转float可能损失精度,因为不会自动转,编译通不过。
转换的目的类型占得空间范围一定要大于转化的源类型
正向过程:由低字节向高字节自动转换
byte->short->int->long->float->double
逆向过程不会自动转,编译通不过,使用强制转换,可能丢失精度。