Java长整型数字太大错误?

27

为什么我把long赋值给min和max时会出现int数值过大的问题?

/*
long: The long data type is a 64-bit signed two's complement integer.
It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of         9,223,372,036,854,775,807 (inclusive).
Use this data type when you need a range of values wider than those provided by int.
*/
package Literals;

public class Literal_Long {
     public static void main(String[] args) {
        long a = 1;
        long b = 2;
        long min = -9223372036854775808;
        long max = 9223372036854775807;//Inclusive

        System.out.println(a);
        System.out.println(b);
        System.out.println(a + b);
        System.out.println(min);
        System.out.println(max);
    }
}

1
你可以使用 Long.MIN_VALUELong.MAX_VALUE 或者 1L << -1-1L >>> 1. - Peter Lawrey
2个回答

77

Java中所有的字面量数字默认都是 int 类型,其范围为从 -21474836482147483647(包括两端)。

由于您的字面量超出了该范围,因此为了使代码编译通过,您需要将它们标记为 long 字面量(即在数字后加上 L 后缀):

long min = -9223372036854775808L;
long max = 9223372036854775807L;

请注意,Java支持大写的 L 和小写的 l,但我建议不要使用小写的 l,因为它看起来像数字 1

long min = -9223372036854775808l; // confusing: looks like the last digit is a 1
long max = 9223372036854775807l; // confusing: looks like the last digit is a 1
如果一个整数字面值后缀是ASCII字符L或l,则它的类型为long;否则它的类型为int。参考Java语言规范第4.2.1节。来自于Java Language Specification的说明。

严谨地说:你也可以使用小写的 l - helpermethod
11
@OliverWeiler 我会说,如果要严谨一点,你可以使用小写的“l”,但最好不要这样做,因为它看起来像数字“1”。 - TC1
如果使用不好的字体,它看起来像是数字1,但是为什么要冒险引起混淆呢? - Bladt

25

您必须使用L告诉编译器它是一个长整型字面量。

long min = -9223372036854775808L;
long max = 9223372036854775807L;//Inclusive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接