2008-12-22 15 views
7

Quelqu'un peut-il m'expliquer la raison du débordement dans la variable a? Notez que b est plus grand que a.Étrange erreur de débordement de C#

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 . . . 

Merci!

Répondre

26

La RHS est une multiplication int car chaque partie de l'expression est un int. Ce n'est pas parce qu'il est assigné à long que cela se fait avec une longue arithmétique.

Modifier à:

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

et ça va marcher. (La différence est le L à la fin du premier 1024.)

+0

Peut-être que le temps d'exécution pourrait être plus flexible et automatiquement "étendre" le calcul s'il voit que l'expression sera stockée longtemps? –

+0

@Petar: Je pense que ce serait une mauvaise idée. Cela rendrait la langue beaucoup plus compliquée. Il est facile d'éviter ce problème et il garde le langage simple - il y a quelques endroits où la signification d'une expression dépend de son contexte (par exemple les expressions lambda) mais je ne veux pas en voir plus. –