2016-04-19 8 views
-2

Angenommen, ich habe eine arithmetische Funktion, die zwei long Variablen hinzufügt und einen long Wert zurückgibt. Wenn sie Long.MaxValue() als Argument übergeben, wird es kein perfektes Ergebnis geben. Was wird die Lösung dafür sein? Der Code unten erklärt, was ich meine:Arithmatic Operation in Java

public class ArithmaticExample {  
    public static void main(String[] args) { 
     System.out.println(ArithmaticExample.addLong(Long.MAX_VALUE, Long.MAX_VALUE)); 
    } 

    public static long addLong(long a,long b){ 
     return a+b; 
    }  
} 
+0

* "Was wird die Lösung dafür sein?" * Die Lösung für was? 'lang' hat eine Reichweite. Wenn Sie 'Long.MAX_VALUE' zu sich selbst hinzufügen, überschreiten Sie diesen Bereich und wickeln ihn um. Damit? (Ich würde wahrscheinlich woanders nach Arbeit suchen, es sei denn, der Interviewer hätte eine bessere Frage als diese.) –

+0

Was ist das erwartete Ergebnis? Gute Lösungen sind "Überlauf" (das ist schon passiert), "sättigen", "erweitern" (obwohl es kein breiteres primitives gibt, müsstest du zu BigInteger gehen) und "Fehler raus". – Thilo

Antwort

1

So kann man das Holz von den Bäumen sehen, lassen Sie uns das Problem Neufassung eher mit byte als long und betrachten

byte a = 0b01111111; // i.e. 127, the largest value of a `byte`. 
byte b = 0b01111111; 
byte c = (byte)(a + b); 

, wo Sie die explizite Umwandlung müssen Umgehung der Umwandlung von a + b in eine int.

Computing c von Hand gibt Ihnen 0b11111110. Dies ist natürlich die bitweise Darstellung von -2 in einem 8-Bit-2-Komplement-Typ.

Also die Antwort für die byte Fall ist -2. Und das gleiche gilt für eine long: Es gibt nur mehr 1 Bits in Ihrem Zusatz zu kämpfen.

Beachten Sie, dass, obwohl all dies in Java perfekt definiert ist, dasselbe nicht für C und C++ gesagt werden kann.

Wenn Sie zwei long Werte in dieser Größenordnung hinzufügen müssen, verwenden Sie BigInteger.

0

Das Ergebnis ist -2. Dies ist nicht das, was erwartet wird, da es eher ein Überlauf als alles andere zu sein scheint, aber dieses Ergebnis ist "normal".

Long.MAX_VALUE = 9223372036854775807 
Long.MAX_VALUE + 1 = 9223372036854775807 
Long.MAX_VALUE + Long.MAX_VALUE = -2