Multipliant les valeurs longues?
class Main {
public static void main (String[] args){
long value = 1024 * 1024 * 1024 * 80;
System.out.println(Long.MAX_VALUE);
System.out.println(value);
}
}
De sortie est:
9223372036854775807 0
C'est correct si long value = 1024 * 1024 * 1024 * 80L;
!
Vous devez vous connecter pour publier un commentaire.
En Java, tous les calculs se fait dans le plus grand type de données requis pour s'occuper de toutes les valeurs actuelles. Donc, si vous avez int * int, il sera toujours faire le calcul comme un entier, mais int * long est fait comme un long.
Dans ce cas, l'1024*1024*1024*80 est fait comme un Int, qui déborde int.
Le "L" bien sûr, les forces de l'un des opérandes d'une Int-64 (long), donc tous les calculs sont fait en stockant les valeurs qu'un Long, donc pas de dépassement de capacité se produit.
short
s n'est pas fait commeshort
s, il est fait commeint
s.myShort += anotherShort;
mais pasmyShort = myShort + anotherShort;
. J'aime aribtrary précision des entiers...long
est fait commeint
. Arithmétique à virgule flottante sansdouble
est fait commefloat
(je pense que j'en oublie ce qui se passe, vous nelong+float
). J'aime toujours en précision arbitraire.Les entiers littéraux sont
int
s. Leint
s de débordement. Utiliser leL
suffixe.Si les données proviennent de variables soit jetés ou de céder à la nostalgie à l'avance.
Strictement parlant, vous pouvez vous en sortir avec moins de suffit, mais c'est probablement mieux pour être clair.
Pas aussi les minuscules
l
comme un suffixe peut être confondu comme un1
.Je soupçonne que c'est parce que par défaut de java traite des littéraux entiers, pas longs. Donc, sans le L sur 80 la multiplication des débordements.
Ce code:
multiplie certains entiers ensemble, le convertit en un long et affecte le résultat à une variable. La réelle de la multiplication sera fait par javac plutôt que lorsqu'il s'exécute.
Depuis int de 32 bits, la valeur est bouclé, et les résultats dans un zéro.
Comme vous le dites, à l'aide de valeurs longues sur le côté droit donne un résultat qui seulement enveloppements si elle dépasse 64 bits.
Si j'ai bien compris, selon vos besoins, vous avez voulu multiplier ces valeurs
1024 * 1024 * 1024 * 80;
Calculatrice je vois valeurs à venir 1024 * 1024 * 1024 * 80=85899345920.
Vous pouvez y aller votre code java: Ces monétaire calcul de la valeur en java