long m = 24 * 60 * 60 * 1000 * 1000;
Der obige Code erstellt Überlauf und druckt das richtige Ergebnis nicht.Überlauf tritt bei Multiplikation auf
long m2 = 24L * 60 * 60 * 1000 * 1000;
long m3 = 24 * 60 * 60 * 1000 * 1000L;
Die obigen 2 Zeilen geben das korrekte Ergebnis aus.
Meine Fragen sind-
- Ist es für den Compiler Rolle, die ich benutze,
m2
oderm3
? - Wie beginnt Java zu multiplizieren? Von links nach rechts oder von rechts nach links? Wird 24 * 60 zuerst oder 1000 * 1000 berechnet?
oops- lange m2 = 24L * 60 * 60 * 1000 * 1000 * 1000 * 1000; lang m3 = 24 * 60 * 60 * 1000 * 1000 * 1000 * 1000L; m2 und m3 geben nicht dasselbe Ergebnis, wenn multipliziert mehr sagen um einen Faktor von 1000 * 1000. Es scheint also, dass die Multiplikation von links nach rechts erfolgt. – rents
Rechts, benutze 'm2', so dass jede Zwischenmultiplikation zu' long' befördert wird. Multiplikation ist linksassoziativ, also von links nach rechts. – GriffeyDog
Multiplikation ist assoziativ, so dass die Reihenfolge keine Rolle spielt. Es wird jedoch von links nach rechts berechnet, wenn es darauf ankommt, wie zum Beispiel Aufrufmethoden, die eine Zahl zurückgeben. –