long
ürününü int
ürününe dönüştürmek istiyorum.Uzun ile int dönüştürebilir miyim?
long
>int.MaxValue
değeri, bunun etrafına sarılmasına izin vermekten mutluluk duyuyorum.
En iyi yol nedir?
long
ürününü int
ürününe dönüştürmek istiyorum.Uzun ile int dönüştürebilir miyim?
long
>int.MaxValue
değeri, bunun etrafına sarılmasına izin vermekten mutluluk duyuyorum.
En iyi yol nedir?
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);
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.
* "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 –
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
(int) geçerli iken, Dönüştürme daha iyi bir yanıttır. Garip verilerden daha garip istisnalara sahip olmak daha iyidir. –
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();
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
@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
...
int MyInt = (int) (MyLong & 0xFFFFFFFF)
Bit Maskesi (0xFFFFFFFF
) Int boyutunun makineye bağlı olması nedeniyle, değer Int boyutuna bağlı olacaktır.
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
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. –
+1, yeni rastgele kullanılan (işaretlenmemiş (int (int) DateTime.Now.Ticks)) –
@Chris: 'new Random()' başlık altında 'Environment.TickCount 'kullanır; Saat keneleri ile elle tohumlamaya gerek yoktur. –