2009-05-13 15 views

cevap

170

Sadece (int)myLongValue yapın. unchecked bağlamında tam olarak ne istediğinizi yapacağız (MSB'leri silme ve LSB'leri alma) (bu, derleyici varsayılanıdır).

int myIntValue = unchecked((int)myLongValue); 
+12

Aynı soruya sahip olan başkaları için: MSB'leri atmanın sonucun * işareti * üzerinde bir etkisi olabileceğini unutmayın. Yukarıdaki "myIntValue", "myLongValue" değeri pozitif olduğunda ('4294967294 => -2') ve tersi olduğunda (' -4294967296 => 0') negatif sonuç verebilir. Bu yüzden, bir "CompareTo" operasyonu uygularken, bir "long" kelimesini diğerinden "int" 'ye çıkarmanın sonucunu mutlu edemezsiniz ve geri döndüremezsiniz; Bazı değerler için, karşılaştırmanız yanlış sonuç verecektir. –

+18

+1, yeni rastgele kullanılan (işaretlenmemiş (int (int) DateTime.Now.Ticks)) –

+16

@Chris: 'new Random()' başlık altında 'Environment.TickCount 'kullanır; Saat keneleri ile elle tohumlamaya gerek yoktur. –

25
Convert.ToInt32(myValue); 

Ben int.MaxValue daha büyük olduğunda bunu ne yapacağını bilmiyoruz rağmen: değer int uymuyor eğer checked bağlamda OverflowException atacağım.

+34

* "Int.MaxValue'dan daha büyük olduğunda ne yapacağını bilmeme rağmen" * OP'nin istemediği bir "OverflowException" atar: http://msdn.microsoft.com /en-us/library/d4haekc4.aspx –

+4

Eğer myValue> Integer.Max olduğunda başka bir işlem yapmanız gerekiyorsa, dönüştürmeyi çalıştırmadan önce myValue> Integer.Max öğesinin test edilmesi. Convert.ToInt32 (myValue) aksi takdirde taşacak (istisna değil). Bu yöntem de VB.NET'te çalışır. – TamusJRoyce

+3

(int) geçerli iken, Dönüştürme daha iyi bir yanıttır. Garip verilerden daha garip istisnalara sahip olmak daha iyidir. –

13

Bazen gerçek değerle ilgilenmiyorsunuz, ancak checksum/hashcode olarak kullanılıyor. Bu durumda, dahili yöntem GetHashCode() iyi bir seçimdir: güvenli ve hızlı yolu döküm öncesi Bit Maskeleme kullanmaktır

int checkSumAsInt32 = checkSumAsIn64.GetHashCode(); 
+5

Bu yanıt verildiğinden beri bir süre önce oldu, ancak karma sürüm uygulamasının .NET sürümleri arasında farklılık gösterebileceğini belirtin. Bu aslında gerçekleşmeyebilir, ancak bu değerin farklı uygulama/appdomainleri arasında aynı olduğu konusunda hiçbir garanti yoktur. – Caramiriel

+1

@Caramiriel'in ne söylediğine eklemek için: eğer mevcut uygulama oturumunuz sırasında * geçici * hashcode olarak kullanılıyorsa, o zaman 'GetHashCode' uygun bir seçimdir. * Kalıcı bir sağlama toplamı * iseniz - uygulamanızı daha sonra çalıştırdığınızda aynı olacak bir değer varsa, o zaman aynı algoritma olduğu garanti edilmediği için "GetHashCode" özelliğini kullanmayın. – ToolmakerSteve

6

...

int MyInt = (int) (MyLong & 0xFFFFFFFF) 

Bit Maskesi (0xFFFFFFFF) Int boyutunun makineye bağlı olması nedeniyle, değer Int boyutuna bağlı olacaktır.

+0

Sonuç taşmadığında veya negatif bir sayı olduğunda ne yapmak istediğinize karar vermeniz gerekir. Gösterdiğiniz şey hala taşacak, IIRC, çünkü işaretin bitmesine izin veriyorsunuz. [Başka bir cevapta belirtildiği gibi, 'denetlenmemiş' bağlamında taşma olmaz - ancak taşmayı önlemek için "işaretlenmemiş" olarak maskelenmeniz gerekmez, bu nedenle "yalnızca kontrol edilen" bağlamında bir çözüme gerek vardır. 16 bit için örnek. İmzalı 16 bit tutar (-32768, 32767). 0xFFFF ile maskeleme, 65535'e kadar, taşmaya, IIRC'ye neden olan bir değer sağlar. Sadece pozitif istiyorsanız, işaret bitinden kaçınmak için maske, 0x7FFF veya 0x7FFFFFFF olabilir. – ToolmakerSteve

İlgili konular