长整数类型和解决整数运算溢出的问题
long 类型在表示整数时,如果 int 类型的范围不够,就可以使用 long 型。一个 long 型的变量占用 8 个字节(64 位),最大表示范围为 -2⁶³ ~ 2⁶³-1,即 -9223372036854775808 ~ 9223372036854775807。
long 字面值
如果要表示 long 类型的字面值,需要以 L 或 l 结尾:
// long a = 100000000; // 编译错误,100000000 默认是 int 字面值,超出 int 范围会报错
long b = 100000000L; // 正确,加上 L 标识为 long 类型Code language: JavaScript (javascript)
建议使用大写 L,因为小写 l 很容易和数字 1 分不清。
与 long 类型的算术运算
和长整型进行算术运算时,编译器会自动将运算值提升为 long 类型。
对于较大的整数运算(超出 int 范围),可以使用 long 类型来避免溢出:
public static void main(String[] args) {
int a = 100; // 默认 100 就是 int 类型
// long c = 2147483648; // 错误,字面值默认是 int,超出范围
long c = 2147483648L; // 正确,显式声明为 long 字面值
int k = 2147483647 + 1; // 溢出,结果为 -2147483648
System.out.println(k);
long k2 = 2147483647 + 1; // 溢出,结果为 -2147483648
// 因为两个运算值都是 int 类型,结果在赋给 long 之前已经溢出
System.out.println(k2);
long k3 = 2147483647 + 1L; // 正确,其中一个字面值加了 L
// 编译器自动将另一个运算值也提升为 long,结果为 long 类型,不溢出
System.out.println(k3); // 输出 2147483648
}Code language: JavaScript (javascript)
关键点总结
运算时,虽然左边的变量(long 类型)存得下结果,但因为右边的运算值都是 int 类型,得到的结果在存储给左边的 long 之前已经发生了溢出。所以应该给其中一个数字加上 L,让整个运算提升为 long 类型,从而避免溢出。
记住:运算结果的类型由参与运算的字面值类型决定,而不是由接收结果的变量类型决定。