2008-12-22 29 views
7

Birisi bana değişkende taşmanın nedenini açıklayabilir mi? B'nin a'dan büyük olduğunu unutmayın.Garip C# taşma hatası

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

teşekkürler!

cevap

26

RHS, ifadenin her bölümü bir int olduğu için int çoğaltmasıdır. Sadece uzun süredir atanması uzun aritmetik ile gerçekleştirildiği anlamına gelmez. için

Değişim it:

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

ve çalışacağız. (Fark, ilk 1024'ün sonundaki L'dir.)

+0

Belki de bu çalışma ifadesinin uzun süre saklanacağını görürse, çalışma zamanı daha esnek ve otomatik olarak "genişlet" hesaplanabilirdi? –

+0

@Petar: Bence bu kötü bir fikir olurdu. Dili çok daha karmaşık hale getirecektir. Bu sorunu önlemek çok kolaydır ve dili basit tutar - bir ifadenin anlamının içeriğine bağlı olduğu birkaç yer vardır (ör. Lambda ifadeleri) ancak daha fazlasını görmek istemiyorum. –