Comprendre l'écart de valeur numérique
Dans l'extrait de code fourni, l'écart apparent entre les deux opérations de multiplication provient de l'absence ou de la présence de un caractère "L" ajouté à la valeur numérique :
long oneYearWithL = 1000*60*60*24*365L; long oneYearWithoutL = 1000*60*60*24*365;
Ajout de "L" pour garantir une valeur longue
Dans la première expression, le suffixe "L" désigne un littéral entier long, indiquant que la valeur doit être traitée comme un entier de 64 bits. Le résultat de cette multiplication est une valeur longue de 31536000000 millisecondes par an.
L'absence de "L" donne une valeur entière
Dans la deuxième expression, sans le " L", l'opération de multiplication produit une valeur entière. Dans ce cas, le résultat est 1471228928 alors que la valeur attendue devrait être supérieure à 3 milliards de millisecondes.
Dépassement d'entier et troncature
L'écart se produit parce que le résultat de la multiplication de quatre Les entiers de 32 bits (1 000, 60, 60 et 24) dépassent d'un cinquième entier de 32 bits (365) la plage d'un entier, qui est [-2 ^ 31, 2 ^ 31-1]. Le résultat s'enroule, produisant la valeur incorrecte de 1471228928 dans la deuxième expression.
Conversion en représentation complémentaire à 2
En l'absence du suffixe "L", si le résultat de la multiplication des entiers est négatif et dépasse la plage des entiers, il est converti en sa représentation en complément à 2 avant d'être affecté à la variable entière. Cette conversion garantit que la valeur négative peut être représentée dans la plage entière.
Assurer des résultats corrects
Pour obtenir le résultat correct, il est essentiel de déclarer la valeur numérique qui dépasse la plage entière en tant que valeur longue en ajoutant "L" pour garantir une représentation correcte et éviter la troncature ou la conversion en représentation en complément à 2.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!