2012-04-15 7 views
12

Das fühlt sich an wie eine dumme Frage, aber ich kann die Antwort nicht sehen. Ich habe eine UInt64, die einen Maximalwert vonUInt64 und "Die Operation überläuft zur Kompilierzeit im aktivierten Modus"

UInt64.MaxValue 18446744073709551615 

Allerdings haben sollten, wenn ich versuche, eine maßvoll dimensionierten Nummer zuweisen, erhalte ich diese Überlauffehler von „Der Betrieb bei der Kompilierung überläuft im aufgegebenen Modus ". Wenn ich es in einem „nicht markiert“ Block wickeln dann kompiliert und ausgeführt, als ob diese Variable Null ist:

UInt64 value1 = 1073741824 * 8; // Compile error 
UInt64 value2 = 8589934592;  // Actual value - no error 

Warum ist das happenning ??

+0

Ahh ja - das würde es absolut erklären! Danke Leute! –

Antwort

23

Denn:

UInt64 value1 = 1073741824 * 8; 

ist das arithmetische als 32-Bit-Integer-tun, dann es zu einem ulong konvertieren. Versuchen:

UInt64 value1 = 1073741824UL * 8; 

Die UL bedeutet, dass die wörtliche eines unsigned long ist. Abschnitt 2.4.4 der C# Spezifikation Siehe für mehr auf wörtliche Suffixe:

Wenn die wörtliche nach UL suffixed ist, Ul, uL, UL, LU, Lu, Lu, oder lu, ist es vom Typ ulong

4

1073741824 ist ein int, kein UInt64.
Daher überschreitet Ihre Multiplikation das Limit einer 32-Bit-Ganzzahl mit Vorzeichen.

Fügen Sie den beiden Operanden ul (unsigned long) als Suffix hinzu.

1

Sie haben einen Fehler haben, weil Sie mit int statt long 1073741824 betreiben ist noch int (max für int ist 2147483647).
Also im ersten Fall erhalten Sie einen Überlauf von int Typ.
ändern ersten Ausdruck mit:

UInt64 value1 = 1073741824L * 8; 

und Problem wird verschwinden.

+0

hat nicht bemerkt, dass Sie mit vorzeichenlosen Werten arbeiten. Für unsigned long sollten Sie 1073741824UL anstelle von 1073741824L verwenden. –

Verwandte Themen