Ich habe Probleme festzustellen, wenn eine Summe/Multiplikation von zwei Zahlen den Maximalwert einer langen Ganzzahl überschreitet.
Beispielcode:Java-Nummer überschreitet long.max_value - wie zu erkennen?
long a = 2 * Long.MAX_VALUE;
System.out.println("long.max * smth > long.max... or is it? a=" + a);
Das ist mir -2
gibt, während ich es ein NumberFormatException
...
Gibt es eine einfache Art und Weise zu machen, diese Arbeit zu werfen erwarten würde? Weil ich Code habe, der Multiplikationen in verschachtelten IF-Blöcken oder Additionen in einer Schleife ausführt, und ich würde es hassen, jeder IF oder innerhalb der Schleife mehr IFs hinzuzufügen.
Edit: na ja, so scheint es, dass diese Antwort von einer anderen Frage ist die am besten geeignete für das, was ich brauche: https://stackoverflow.com/a/9057367/540394
Ich will nicht Boxen/Unboxing tun, wie es unnecassary Overhead hinzufügt, und auf diese Weise ist sehr kurz, das ist ein großes Plus für mich. Ich werde nur zwei kurze Funktionen schreiben, um diese Überprüfungen durchzuführen und die Min- oder Max-Länge zurückzugeben.
Edit2: hier ist die Funktion für eine lange seine Min-/Max-Grenzwert nach der Antwort, die ich oben verlinkten:
/**
* @param a : one of the two numbers added/multiplied
* @param b : the other of the two numbers
* @param c : the result of the addition/multiplication
* @return the minimum or maximum value of a long integer if addition/multiplication of a and b is less than Long.MIN_VALUE or more than Long.MAX_VALUE
*/
public static long limitLong(long a, long b, long c)
{
return (((a > 0) && (b > 0) && (c <= 0))
? Long.MAX_VALUE
: (((a < 0) && (b < 0) && (c >= 0)) ? Long.MIN_VALUE : c));
}
Sag mir, wenn Sie denken, das ist falsch.
+1. Es sollte eine Bibliothek geben, die Integer-Überlauferkennung ermöglicht. – Thilo
Oder spezielle Blöcke (etwas wie endlich?), Die Entwickler helfen können, Fehler-auf-Überlauf-Verhalten für alle Math-Code, der innerhalb ausgeführt wird. Ich glaube, C# hat eine. Bearbeiten: Es gefunden, [aktiviert und deaktiviert in C#] (http://msdn.microsoft.com/en-us/library/a569z7k8.aspx). –
Nun, C# scheint Fehler auf Überlauf zu werfen (was ich sehr über Schweigen und falsche Ergebnisse, die für mich keinen Sinn machen würde) ... – jurchiks