长整数类型和解决整数运算溢出的问题

长整数类型和解决整数运算溢出的问题

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 类型,从而避免溢出。

记住:运算结果的类型由参与运算的字面值类型决定,而不是由接收结果的变量类型决定。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注