1024 * 1024 * 1024 * 1024et 2147483648n'ont pas la même valeur en Java.
En fait, 2147483648 N'EST MÊME PAS UNE VALEUR (bien que ce 2147483648Lsoit le cas) en Java. Le compilateur ne sait littéralement pas ce que c'est, ni comment l'utiliser. Alors ça gémit.
1024est un entier valide en Java, et un valide intmultiplié par un autre valide intest toujours un valide int. Même si ce n'est pas la même valeur que vous attendez intuitivement car le calcul débordera.
Exemple
Considérez l'exemple de code suivant:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Vous attendez-vous à ce que cela génère une erreur de compilation? Cela devient un peu plus glissant maintenant.
Et si on mettait une boucle avec 3 itérations et qu'on multipliait dans la boucle?
Le compilateur est autorisé à optimiser, mais il ne peut pas modifier le comportement du programme pendant ce temps.
Quelques informations sur la manière dont ce cas est réellement traité:
En Java et dans de nombreux autres langages, les entiers seront constitués d'un nombre fixe de bits. Les calculs qui ne correspondent pas au nombre de bits donné déborderont ; le calcul est essentiellement effectué module 2 ^ 32 en Java, après quoi la valeur est reconvertie en un entier signé .
D'autres langages ou API utilisent un nombre dynamique de bits ( BigIntegeren Java), lèvent une exception ou définissent la valeur sur une valeur magique telle que not-a-number.