600851475143的“整数过大”错误消息

时间:2010-09-21 06:18:32

标签: java integer

public class Three {
    public static void main(String[] args) {
        Three obj = new Three();
        obj.function(600851475143);
    }

    private Long function(long  i) {
        Stack<Long> stack = new Stack<Long>();

        for (long j = 2; j <= i; j++) {
            if (i % j == 0) {
                stack.push(j);
            }
        }
        return stack.pop();
    }
}

运行上面的代码时,它会在行obj.function(600851475143);上产生错误。为什么呢?

8 个答案:

答案 0 :(得分:168)

600851475143不能表示为32位整数(类型int)。它可以表示为64位整数(类型long)。 Java中的长文字以“L”结尾:600851475143L

答案 1 :(得分:57)

附加后缀L23423429L

默认情况下,java将所有数字文字解释为32位整数值。如果你想明确指出这比32位整数更大,你应该使用后缀L作为长值。

答案 2 :(得分:24)

您需要使用长文字:

obj.function(600851475143l);  // note the "l" at the end

但我希望这个功能耗尽内存(或时间)......

答案 3 :(得分:11)

java编译器默认尝试将600851475143解释为int类型的常量值。这会导致错误,因为600851475143无法用int表示。

要告诉编译器您希望数字解释为long,您必须在其后面添加lL。您的号码应该如下600851475143L

由于某些字体难以区分“1”和小写“l”,因此您应始终使用大写字母“L”。

答案 4 :(得分:5)

您需要40位来表示整数字面值600851475143.在Java中,最大整数值为2 ^ 31-1(即整数为32位,请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html)。

这与function无关。请尝试使用长整数文字(如其他答案中所述)。

答案 5 :(得分:3)

在编译时,数字“600851475143”以32位整数表示,尝试使用长文字而不是数字的末尾来解决此问题。

答案 6 :(得分:1)

除了所有其他答案,您可以做的是:

long l = Long.parseLong("600851475143");

例如:

obj.function(Long.parseLong("600851475143"));

答案 7 :(得分:0)

或者,您可以将输入数字声明为long,然后让它执行代码探戈:D ...

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("Enter a number");
    long n = in.nextLong();

    for (long i = 2; i <= n; i++) {
        while (n % i == 0) {
            System.out.print(", " + i);
            n /= i;
        }
    }
}