1024 * 1024 * 1024 * 1024
e 2147483648
non hanno lo stesso valore in Java.
In realtà, 2147483648
NON È ANCHE UN VALORE (anche se lo 2147483648L
è) in Java. Il compilatore non sa letteralmente di cosa si tratta o come utilizzarlo. Quindi si lamenta.
1024
è un int valido in Java e un valido int
moltiplicato per un altro valido int
è sempre valido int
. Anche se non è lo stesso valore che ti aspetteresti intuitivamente perché il calcolo trabocca.
Esempio
Si consideri il seguente esempio di codice:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Ti aspetti che ciò generi un errore di compilazione? Ora diventa un po 'più scivoloso.
E se mettessimo un loop con 3 iterazioni e moltiplicassimo nel loop?
Il compilatore può ottimizzare, ma non può modificare il comportamento del programma mentre lo fa.
Alcune informazioni su come viene gestito questo caso:
In Java e in molte altre lingue, i numeri interi saranno costituiti da un numero fisso di bit. I calcoli che non rientrano nel dato numero di bit verranno traboccati ; il calcolo viene effettuato fondamentalmente modulo 2 ^ 32 in Java, dopo che il valore è tornato convertito in un firmata intero.
Altre lingue o API usano un numero dinamico di bit ( BigInteger
in Java), generano un'eccezione o impostano il valore su un valore magico come non-un-numero.