2016-04-04 16 views
5

Int32 maksimum aralığından daha büyük olan büyük bir sayıyı C# kullanarak int32'ye dönüştürmek istiyorum. Böylece, 2147483647 maksimum aralığından fazla ise, o zaman tekrar -2147483648'den başlayacaktır. Şimdilik bunu şu şekilde yapıyorum:Int32.Maximum + değerli sayıyı int32'ye dönüştürme

long val = 3903086636L; 
long rem = val % 2147483648L; 
long div = val/2147483648L; 
int result = div % 2 == 0 ? (int)rem - 1 : -2147483648 + (int)rem; 

Bunu doğru yaptığımda emin değilim. C# içinde bunu yapmak için herhangi bir yardımcı işlev veya hızlı yolu var mı?

cevap

5

Eğer checked mode sadece beklediğiniz gibi taşma idare edecek döküm, etkin yoksa: o derleyici sertleşen bağımsız hale getirmek için, Matthew Watson tarafından önerildiği gibi,

int i = (int)val; 

Veya:

int i = unchecked((int)val); 

Bu bir istisna alamaz. Tam sayı taşacak ve int.MinValue'dan saymaya devam edecektir.

Kanıtı:

long val = (long)int.MaxValue + 1; 
int result = (int)val; 

Console.WriteLine(result == int.MinValue); // true 
+0

İşaretli modunu devre dışı bırakırsam uygulamamı etkiler mi? – Arnab

+0

Varsayılan olarak devre dışı, yani hayır. –

+4

Veya "int i = unchecked ((int) val)" yazabilir ve derleyicinin "checked" ayarından bağımsız olarak çalışır. –

0

Neden sadece int.MinValue gerisini eklemeyin:

long tmp = myValue - int.MaxValue; 
while(tmp > int.MaxValue) tmp -= int.MaxValue; 

if (tmp > 0) tmp = int.MinValue + tmp; 

döngü de 2 * int.MaxValue sonra büyüktür sayılar üzerinde çalışabilir olduğunu korur.

Bunu kullanırsanız ve myValue = 3 * int.MaxValue + 1 ile test ederseniz, sonuç olarak 2147483647 alırsınız.

+1

ya "myValue", 4 * int.MaxValue'ye eşitse? – wimh

+0

@Wimmel iyi bir nokta, sanırım bu durumda bir döngüye ihtiyacımız var, bunu yakında güncelleyeceğiz. – HimBromBeere

+0

'myValue' int.MaxValue + 1' öğesine eşitse, sonucun int.MinValue' değil, int.MinValue + 1' olması gerektiğine inanıyorum. MyValue = 2 * int.MaxValue + 2''ye eşitse, sonucun '0' değil, int.MinValue + 2' olması gerektiğine inanıyorum. – wimh

İlgili konular