long oneYearWithL = 1000*60*60*24*365L;
long oneYearWithoutL = 1000*60*60*24*365;
Votre première valeur est en fait une longue (Depuis 365L
est long
, et 1000*60*60*24
est integer
, de sorte que le résultat de l' multiplying
un long
de la valeur avec un integer
de la valeur est une long
de la valeur.
Mais la 2ème valeur est un entier (Puisque vous êtes mulitplying un integer
de la valeur avec un integer
de la valeur seulement. Donc, le résultat sera un 32-bit
entier. Maintenant, le résultat obtenu pour qui multiplication
est en dehors de la portée réelle de l'entier. Donc, avant d'être affecté à la variable, il est tronqué en entier valide gamme.
Jetez un oeil à l'instruction print: -
System.out.println(1000*60*60*24*365L);
System.out.println(1000*60*60*24*365);
System.out.println(Integer.MAX_VALUE);
Lorsque vous exécutez le code ci-dessus: -
Sortie: -
31536000000
1471228928
2147483647
Donc, vous pouvez voir la différence..
011101010111101100010010110000000000 -- Binary equivalent of 1000*60*60*24*365L
01111111111111111111111111111111 -- Binary equivalent of Integer.MAX_VALUE
Donc, si vous n'ajoutez pas qu' L
à la fin de votre numéro, le 4 bit de poids fort est retiré de la première chaîne binaire..
Ainsi, la chaîne devient..
(0111)01010111101100010010110000000000 -- Remove the most significant bits..
01010111101100010010110000000000 -- Binary equivalent of 1471228928
(que vous obtiendrez en sortie)
Mise à JOUR: -
À partir de l'explication ci-dessus, vous pouvez aussi comprendre que, même dans la première affectation, si le résultat de votre multiplication
de integers
avant de multiplier il avec 365L
sort de la plage, puis à nouveau, il sera tronqué dans l'intervalle entier, ou convertis en 2's complement representation
, si nécessaire, et ensuite seulement il sera multiplié par l' long value - 365L
.
Pour l'e.g: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
Dans l'exemple ci-dessus, l'examen de la première partie - 1000*60*60*24*30
. Le résultat de cette multiplication est: - 2592000000
. Maintenant, permet de' voir comment il est représenté en binary equivalent
: -
2592000000 = 10011010011111101100100000000000 -- MSB is `1`, a negative value
01100101100000010011100000000001 -- 2's complement representation
Représentation décimale de l' 2's complement
représentation est - 1702967297
. Donc, 2592000000
est converti -1702967297
, avant de se multiplier pour 365L
. Depuis, cette valeur s'inscrit dans l' integer range
qui est : - [-2147483648 to 2147483647]
, de sorte qu'il ne sera pas tronqué plus loin.
Donc, le résultat sera: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
= 2592000000 * 365L;
= -1702967297 * 365L = -621583063040
Donc, tous ces étoffes juste estime le réel type
du résultat final sur l'application de l'opération arithmétique. Et ce contrôle est effectué sur chaque temporaire du résultat des opérations de déménagement à partir de left to right
(en tenant compte d'opérateurs left-to-right
associativité). Si aucun résultat temporaire est trouvé pour être hors de portée, puis converti en conséquence pour tenir dans la plage requise, avant d'aller de l'avant avec l'opération suivante.
Mise à JOUR 2: -
Ainsi, au lieu de: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
si vous déplacez votre 365L
au début, puis vous obtiendrez le résultat correct: -
long thirtyYearWithL = 365L*1000*60*60*24*30; // will give you correct result
Parce que, maintenant, votre temporary
résultat sera de type long
, et est capable de retenir cette valeur.