2009-05-06 6 views
7

Ich bin ein seltsames Verhalten in einem .net-Programm erleben:Warum verhält sich mein .net Int64 wie Int32?

Console.WriteLine(Int64.MaxValue.ToString()); 
// displays 9223372036854775807, which is 2^63-1, as expected 

Int64 a = 256*256*256*127; // ok 

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode" 
// If i do this at runtime, I get some negative values, so the overflow indeed happens. 

Warum verhält sich mein Int64 ist, als ob sie Int32 ist, obwohl Int64.MaxValue sie 64 Bits verwenden, um zu bestätigen scheint?

Wenn es relevant ist, ich bin ein 32-Bit-Betriebssystem verwenden und die Zielplattform ist auf „Jeder CPU“

Antwort

20

Ihre RHS nur Int32 Werte verwendet, so dass die ganze Operation Int32 Arithmetik durchgeführt wird, dann wird das Int32Ergebnis zu einem langen befördert.

ändern es dazu:

Int64 a = 256*256*256*128L; 

und alles wird gut.

+1

Dang Sie Jon Skeet! Du hast mich um 10 Sekunden geschlagen! :) –

+0

Ich fühle mich dumm :) Danke! – Brann

+0

Du bist nicht dumm, es ist zunächst ein wenig unintelligent. Ich wurde damals gebissen, als ich erwartet hatte, dass "double res = someInt/otherInt" eine Gleitkomma-Division macht (was nicht der Fall ist) und dass die linke Seite keine Rolle spielt. –

4

Verwendung:

Int64 a = 256L*256L*256L*128L; 

das Suffix L bedeutet Int64 literal, bedeutet kein Suffix Int32.

Was Ihr schrieb:

Int64 a = 256*256*256*128 

bedeutet:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128; 
+0

wird das Kapitalsuffix 'L' empfohlen, da es leichter zu erkennen ist, und in einigen Schriften kann man nicht einmal zwischen '1' und 'l' unterscheiden –

Verwandte Themen