Das ist wirklich komisch. Ich war das Aufspüren von diesen Fehler:Unterschiedliches Gießverhalten
Negating the minimum value of a twos complement number is invalid.
... und es stellte sich heraus, dass es zu Code wie folgt fällig war:
var valueFromUser = "470259123000000";
var doubleValue = Convert.ToDouble(valueFromUser, CultureInfo.InvariantCulture);
Math.Abs((int)doubleValue);
der Tat, wenn ich dies in LINQPad laufen:
(int)Convert.ToDouble("470259123000000", CultureInfo.InvariantCulture)
... es gibt mir:
-2147483648
jedoch ein anderer Entwickler hier, sagt er etwas ganz anderes (nicht in LINQPad) bekommt:
-1141206336
Wenn ich versuche, auf einem konstanten selbst nur die Besetzung zu bewerten:
(int)470259123000000.0
... I Erhalte einen Kompilierfehler, da unchecked
benötigt wird. Und dies:
unchecked((int)470259123000000.0)
... ausgewertet -1141206336
wie der andere Entwickler bekam. Also dachte ich, vielleicht hat der Convert
einen subtil anderen Wert als die Konstante erstellt. Nein, diese auswertet zu True
:
Convert.ToDouble("470259123000000", CultureInfo.InvariantCulture) == 470259123000000.0
Was zum Teufel ist hier los? Warum führt die Auswertung dieser scheinbar identischen Ausdrücke zu so unterschiedlichen Ergebnissen?
aktualisieren:
einen Hinweis gefunden. Die hexadezimale Darstellung von 4.70259123E14
und -1141206336
ist:
0x42FABB2BBFA92C00
0xBBFA92C0
Also ich denke, einer der Abgüsse wird die Bits direkt in den int
schubsen. So ist -2147483648
das größere Geheimnis.
Interessant. Scheint wie ein Unterschied zwischen überprüftem und ungeprüftem Casting-Verhalten.Mit der High-Tech-Anwendung "Calculator" (natürlich im "Programmer" -Modus ;-) kann ich sehen, dass '-1141206336' dem abgeschnittenen (32 lsb) von' 470259123000000' entspricht. Die geprüfte Version scheint "int.MinValue" zurückzugeben. Ich bin sicher, dass jemand in der Sprachspezifikation darauf hinweisen kann. – Alex