2009-05-06 16 views
7

Bir .net programında bir garip davranışlar tanık ediyorum:Neden. Net Int64'lar Int32'ninki gibi davranıyor?

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. 

Neden benim Int64 en davranır Int64.MaxValue onlar 64 bit kullanıyorsanız onaylamak için görünse de onlar Int32 en, sanki?

tekrar ilgili, ben 32 bit işletim sistemi kullanıyorum ve tüm operasyon Int32 aritmetik kullanılarak gerçekleştirilir, böylece hedef platformu,

cevap

20

Kişisel RHS sadece Int32 değerleri kullanıyor "Herhangi bir CPU" olarak ayarlandığında, daha sonra Int32sonucu uzun bir süreye yükseltilir. Buna

Değişim it:

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

ve her şey iyi olacak.

+1

Dang Jon Skeet! Beni yaklaşık 10 saniye yendin! :) –

+0

Aptal hissediyorum :) Teşekkürler! – Brann

+0

Sen aptal değilsin, ilk başta biraz sezgisel değil. "Çift res = someInt/otherInt" bir kayan nokta bölümü (ki değil) ve sol tarafın önemli olmadığını öğrendim zaman o zaman ısırıldı. –

4

Kullanım:

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

m soneki Int64 değişmez anlamına gelir, bir eki Int32 anlamına gelir.

Ne senin yazdı:

Int64 a = 256*256*256*128 

şu anlama gelir:

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

baş harfi 'L' daha kolay tanındığı için tavsiye edilir ve bazı yazı tiplerinde' 1' ve 'l' ayırt edemezsiniz. –

İlgili konular