Frage

Ich erhalte Overflow 's auf mich geworfen, wenn ich sie nicht will (oder so glaube ich). Ich bin einige seltsame Berechnungen ausführen, bei denen ich die Werte erwarten überlaufen, überschwemmt Wegwerfen Bits. Es scheint, ich kann das nicht bekommen richtig obwohl zu arbeiten. Im Grunde ist dies ein Paar i und j, die geschieht, wie ich über riesige Mengen (int.MinValue zu int.MaxValue) iterieren.

// i and j are ints
// i is -2147483648
// j is -1
var x = i / j;

// I also tried using unchecked keyword, but it doesn't help    
var x = unchecked(i / j);

Update:

Der erwartete mathematische Wert von -2147483648 / -1 ist 2147483648. Dies ist jedoch bestimmte Code versucht nicht wirklich um die Nummer zu finden. Dies ist Teil einer Reihe von Dingen, Bit-Manipulation ein bisschen schwer zu verstehen gegangen. Um ehrlich zu sein, weiß ich nicht einmal selbst, was die Absicht war, weil ich nicht wirklich das Verfahren dokumentieren habe, und alle dauerte es war aus ihm einem Tag weg ernst WTF-Blasen über den Kopf zu heben. Alle wissen, dass ich sich wie beabsichtigt mit speziellem Code arbeitet entworfen, den Fall zu behandeln.

über den erwarteten Wert:

Da int nur 2147483647 hält es max ist, erwarte ich den Überlauf zu verwerfen Wert ergeben 0.

Wenn ich etwas über diese überhaupt gelernt haben, ist es wahrscheinlich die Bedeutung der Dokumentation für obskure Methoden.

War es hilfreich?

Lösung

Ich glaube, dies ist die nur Fall, in dem Sie diese Ausnahme erhalten werden. Es ist der einzige Bereich, in dem Int32 Bereich, der überlaufen kann. (Es gibt eine Division durch Null natürlich, aber das ist eine andere Ausnahme.)

Wenn Sie also OverflowException vermeiden wollen Sie nur müssen mit diesem Fall befassen. Was möchten Sie tun, es zu tun? Schreiben Sie eine Methode, die diese spots genau Fall, und auch sonst tut normale Division.

Hinweis: Dies ist auch, warum man nicht einen Vergleich von nur negieren das Ergebnis umkehren sollte versuchen. Wenn Sie etwas sortieren in absteigender Reihenfolge statt aufsteigend, dann anstelle -Compare(x, y) Verwendung Compare(y, x) zu verwenden. Die Negation nicht gibt Überlauf für int.MinValue (es sei denn, Sie in einem geprüften Kontext sind.) - es nur leise zurück int.MinValue

Andere Tipps

Zweier-Komplement bedeutet, dass ganze Zahlen von 2 ^ 32 reichen wird -. 1 bis -2 ^ 32, so -2147483648 / -1 zurückkehrt eine Zahl, die durch einen int dargestellt wird, kann nicht

Sie könnten versuchen, es in ein long setzen. Es gibt keinen Grund, eine var in dieser Situation zu verwenden.

Sie können umgehen diese mit etwas Gießen zu / von Int64:

var x = (int)((long)i / j);

Sie tun dies. Warum würden Sie var hier benutzen? Er verliert die Fähigkeit, die Art des arithmetischen Ergebnisses zu zeigen alle 1 Zeichen für das Speichern ...

long x = (long)i / j;

Wenn Sie möchten, Sättigung, können Sie:

int x = (int)Math.Min((long)i / j, int.MaxValue);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top