1024 * 1024 * 1024 * 1024
et 2147483648
n'ont pas la même valeur en Java.
En fait, 2147483648
N'EST MÊME PAS UNE VALEUR (bien que ce 2147483648L
soit le cas) en Java. Le compilateur ne sait littéralement pas ce que c'est, ni comment l'utiliser. Alors ça gémit.
1024
est un entier valide en Java, et un valide int
multiplié par un autre valide int
est 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 ( BigInteger
en Java), lèvent une exception ou définissent la valeur sur une valeur magique telle que not-a-number.