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 qu' 2147483648L
) en Java. Le compilateur littéralement ne sais pas ce que c'est, ou comment l'utiliser. Donc, il couine.
1024
est une valeur de type int en Java, et une pièce d' int
multiplié par un autre valide int
, est toujours valide int
. Même si ce n'est pas la même valeur que vous attendez, parce que le calcul est en dépassement de capacité.
Exemple
Considérons l'exemple de code suivant:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Voudriez-vous attendre à ce que cela génère une erreur de compilation? Il devient un peu plus glissante maintenant.
Que faire si nous avons mis une boucle avec 3 itérations et multiplié dans la boucle?
Le compilateur est autorisé à optimiser, mais il ne peut pas changer le comportement du programme, alors qu'il est le faire.
Quelques infos sur la façon dont cette affaire est en fait pris en charge:
En Java, et bien d'autres langues, les entiers sera constitué d'un nombre fixe de bits. Des calculs qui ne rentrent pas dans le nombre donné de bits de dépassement; le calcul est essentiellement effectuée le module 2^32 en Java, d'après laquelle la valeur est convertie en un signé entier.
Autres langues ou de l'API de l'utilisation d'une dynamique d'un nombre de bits (BigInteger
en Java), soulever une exception ou définir la valeur à une valeur magique comme not-a-number.