java integer - Messaggio di errore "Numero intero troppo grande" per 600851475143



max value (8)

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

Quando viene eseguito il codice precedente, viene generato un errore sulla riga obj.function(600851475143); . Perché?


Answers

Al momento della compilazione, il numero "600851475143" è rappresentato in numero intero a 32 bit, prova invece a letterale lungo alla fine del tuo numero per superare questo problema.


Oppure, è possibile dichiarare il numero di input più a lungo, quindi lasciare che faccia il codice tango: 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;
        }
    }
}

Il compilatore java tenta di interpretare 600851475143 come valore costante di tipo int per impostazione predefinita. Ciò causa un errore poiché 600851475143 non può essere rappresentato con un int.

Per dire al compilatore che vuoi interpretare il numero come un lungo devi aggiungere l o L dopo di esso. Il tuo numero dovrebbe quindi assomigliare a questo 600851475143L .

Poiché alcuni tipi di carattere rendono difficile distinguere tra "1" e minuscolo "l" l'uno dall'altro, è necessario utilizzare sempre la lettera maiuscola "L".


Hai bisogno di 40 bit per rappresentare il numero intero letterale 600851475143. In Java, il valore intero massimo è 2 ^ 31-1 tuttavia (cioè gli interi sono a 32 bit, vedi http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html ).

Questo non ha nulla a che fare con la function . Prova invece a utilizzare un letterale intero lungo (come suggerito nelle altre risposte).


Devi usare un letterale lungo:

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

Ma mi aspetterei che questa funzione esaurisca la memoria (o il tempo) ...


600851475143 non può essere rappresentato come numero intero a 32 bit (tipo int ). Può essere rappresentato come un numero intero a 64 bit (tipo long ). i letterali lunghi in Java terminano con una "L": 600851475143L


Oltre a tutte le altre risposte, quello che puoi fare è:

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

per esempio :

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

Fonte: clicca qui

Oltre a verificare che la tua applicazione Android soddisfi i suoi requisiti funzionali, è importante assicurarsi che il tuo codice non abbia problemi strutturali. Un codice scarsamente strutturato può influire sull'affidabilità e sull'efficienza delle tue app Android e rendere il tuo codice più difficile da mantenere. Ad esempio, se i file di risorse XML contengono spazi dei nomi inutilizzati, questo occupa spazio e incorre in un'elaborazione non necessaria. Altri problemi strutturali, come l'uso di elementi deprecati o chiamate API non supportate dalle versioni API di destinazione, potrebbero causare il mancato funzionamento del codice in modo corretto.

L'SDK Android fornisce uno strumento di scansione del codice chiamato lint che può aiutarti a identificare e correggere facilmente i problemi relativi alla qualità strutturale del tuo codice, senza dover eseguire l'app o scrivere casi di test. Ogni problema rilevato dallo strumento viene segnalato con un messaggio di descrizione e un livello di gravità, in modo da poter assegnare rapidamente la priorità ai miglioramenti critici che è necessario apportare. È inoltre possibile configurare il livello di gravità di un problema per ignorare problemi non rilevanti per il progetto o aumentare il livello di gravità. Lo strumento ha un'interfaccia a linea di comando, quindi puoi facilmente integrarlo nel tuo processo di test automatizzato.

Lo strumento lint controlla i file di origine del progetto Android per potenziali bug e miglioramenti di ottimizzazione per correttezza, sicurezza, prestazioni, usabilità, accessibilità e internazionalizzazione. È possibile eseguire lint dalla riga di comando o dall'ambiente Eclipse.





java integer