2008-12-22 6 views
7

Kann mir jemand den Grund des Überlaufs in Variable a erklären? Beachten Sie, dass b größer als a ist.Merkwürdiger C# Überlauffehler

static void Main(string[] args) 
{ 
    int i = 2;  
    long a = 1024 * 1024 * 1024 * i; 
    long b = 123456789; 
    System.Console.WriteLine("{0}", a); 
    System.Console.WriteLine("{0}", b); 
    System.Console.WriteLine("{0}", long.MaxValue); 
} 

-2147483648 
123456789
9223372036854775807 
Press any key to continue . . . 

Vielen Dank!

Antwort

26

Die RHS ist eine int Multiplikation, weil jeder Teil des Ausdrucks ein int ist. Nur weil es zu lange zugewiesen ist, bedeutet das nicht, dass es mit langer Arithmetik durchgeführt wird.

Ändern Sie es an:

long a = 1024L * 1024 * 1024 * i; 

und es wird funktionieren. (Der Unterschied ist das L am Ende der ersten 1024.)

+0

Vielleicht könnte Laufzeit flexibler sein und "Berechnung" automatisch "erweitern", wenn es sieht, dass Ausdruck lange gespeichert wird? –

+0

@Petar: Ich denke, das wäre eine schlechte Idee. Es würde die Sprache viel komplizierter machen. Es ist leicht, dieses Problem zu vermeiden, und es hält die Sprache einfach - es gibt einige Stellen, wo die Bedeutung eines Ausdrucks von seinem Kontext abhängt (z. B. Lambda-Ausdrücke), aber ich möchte nicht mehr sehen. –