94 votes

Message d'erreur "Integer number too large" pour 600851475143

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();
    }
}

Lorsque le code ci-dessus est exécuté, il produit une erreur sur la ligne obj.function(600851475143); . Pourquoi ?

212voto

Yuliy Points 8854

600851475143 ne peut pas être représenté comme un entier de 32 bits (type int ). Il peut être représenté par un nombre entier de 64 bits (type long ). En Java, les littéraux longs se terminent par un "L" : 600851475143L

76voto

Roman Points 21807

Ajouter un suffixe L : 23423429L .

Par défaut, java interprète tous les littéraux numériques comme des valeurs entières de 32 bits. Si vous voulez spécifier explicitement qu'il s'agit de quelque chose de plus grand qu'un entier de 32 bits, vous devez utiliser le suffixe L pour les valeurs longues.

30voto

Thilo Points 108673

Vous devez utiliser un long littéral :

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

Mais je m'attendrais à ce que cette fonction manque de mémoire (ou de temps) ...

13voto

josefx Points 8417

Le compilateur java essaie d'interpréter 600851475143 comme une valeur constante de type int par défaut. Cela provoque une erreur puisque 600851475143 ne peut pas être représenté par un int.

Pour indiquer au compilateur que vous voulez que le nombre soit interprété comme un long, vous devez ajouter soit l o L après elle. Votre numéro devrait alors ressembler à ceci 600851475143L .

Comme certaines polices de caractères ne permettent pas de distinguer le "1" du "l" minuscule, vous devez toujours utiliser le "L" majuscule.

6voto

Andre Holzner Points 6419

Vous avez besoin de 40 bits pour représenter le littéral entier 600851475143. En Java, la valeur maximale des nombres entiers est toutefois 2^31-1 (c'est-à-dire que les nombres entiers sont de 32 bits, cf. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html ).

Cela n'a rien à voir avec function . Essayez d'utiliser un entier long littéral à la place (comme suggéré dans les autres réponses).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X