Weil der zweite Wert ein integer
nicht ein long
verwendet und übergelaufen ist.
Wenn Sie ein L am Ende einer der beiden Konstanten hinzufügen, wird es auf long
-Werte gesetzt und die Differenz verschwindet.
Dies liegt daran, dass im zweiten Beispiel beide Werte ganze Zahlen sind. int * int = int. Es wird nur zu long befördert, wenn einer oder mehrere der multiplizierten Werte (oder irgendeine andere mathematische Operation für diesen Fall) lang ist. Es gibt keine "Magie", die den Überlauf erkennt und die Werbung für Sie durchführt.
Selbst wenn Sie long x = int*int
gemacht haben, wird die Multiplikation immer noch in 32 Bits durchgeführt und dann das Ergebnis in 64 Bit für die Zuweisung konvertiert.
Sie können dies auch an subtileren Orten sehen, zum Beispiel:
%Vor%Auch wenn Ergebnis und l beide lang sind, wird das x * y immer noch als Ganzzahlen ausgeführt, da die Multiplikation zuerst erfolgt. Selbst wenn x und y einzeln in eine 32-Bit-Ganzzahl passen, tritt das Produkt der beiden nicht in eine Überlaufsituation ein. Die Lösung besteht darin, sicherzustellen, dass sie zu dem frühesten Zeitpunkt konvertiert wird, an dem das Überlaufrisiko auftritt - zum Beispiel:
%Vor%