600851475143的"整数过大"错误消息

use*_*654 76 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Yul*_*liy 179

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


Rom*_*man 64

附加后缀L:23423429L.

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

  • @Thilo:他可能不善于记忆数字,也懒得复制粘贴的东西.:) (2认同)

Thi*_*ilo 26

你需要使用长文字:

obj.function(600851475143l);  // note the "l" at the end
Run Code Online (Sandbox Code Playgroud)

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

  • 将l`大写成一个更好的做法,以便它很容易与`1'区分开来 (15认同)
  • @Bozho:同意.但我有一个Perl背景.我编码"只写":-) (2认同)

jos*_*efx 12

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

要告诉编译器您希望数字解释为long,您必须添加lL之后添加.那么你的号码应该是这样的600851475143L.

由于某些字体难以区分"1"和小写"l",因此应始终使用大写"L".


And*_*ner 5

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

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


小智 5

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