Auf die Gefahr wird nach unten gestimmt, Sie können Ihren eigenen Absolutwert-Methode zu schreiben, je auf was du es verwendest. Der folgende Codeausschnitt (sorry, es ist in C#, aber das gleiche Prinzip gilt):
short i = -32768;
int iAbs = Math.Abs(i);
wird gerne kompilieren, aber wenn ausführen, wird die zweite Zeile eine Overflow mit der hilfreichen Nachricht werfen „Negieren den Minimalwert von a Zweierkomplementnummer ist ungültig. " In diesem Fall wählt der Compiler die Überladung von Math.Abs aus, die einen Short akzeptiert und einen Short zurückgibt, und +32768 ist kein gültiger Short. Daher gibt die Methode die Exception aus, selbst wenn Sie gedacht haben, dass Sie antizipieren Dieses Problem, indem ich iAbs zu einem Int.
Dieser Code-Schnipsel:
short i = -32768;
int iAbs = Math.Abs((int)i);
wird ohne Ausnahme kompilieren und ausführen, aber es ist irgendwie klobig auf diese Weise zu codieren. Meiner Meinung nach ist das ein sehr hinterhältiger Fehler, weil es in der realen Welt so selten vorkommt (da es für jeden Typ nur einen Wert gibt, der diese Ausnahme erzeugt). Ich stoße leider auf diesen Fehler, wenn ich Math.Abs für die Normalisierung von Audiodaten benutze (was normalerweise ein kurzes [] Array ist), also habe ich mir angewöhnt, meinen eigenen Wrapper rund um Math.Abs zu schreiben Dies ist für mich und gibt einfach ein Doppel:
mit Überlasten für was auch immer andere Art, die ich behandeln muss. Ich verstehe irgendwie, warum Math.Abs geschrieben wurde, um sich so zu verhalten, aber es kann definitiv die Hintern des Unwissens beißen.
Das ist einfach, danke! – Cyclone
Nun, zumindest der MSDN-Link hat Sub-Links, die das potenzielle Überlaufproblem erwähnen, auch wenn niemand jemals daran denken würde, tatsächlich auf sie zu klicken. – MusiGenesis
Übrigens, ich denke, Sie sollten einen sofortigen 20K Reputationsbonus für Ihre Arbeit am Daily WTF erhalten. – MusiGenesis