Yanıtlar:
Sadece yap (int)myLongValue. Tam olarak istediğinizi yapar (MSB'leri atar ve LSB'leri alır) uncheckedbağlamda (derleyici varsayılanıdır). Değer aşağıdakilere uymuyorsa bağlam OverflowExceptioniçinde atar :checkedint
int myIntValue = unchecked((int)myLongValue);
new Random()kullanır Environment.TickCount; saat keneleri ile elle tohumlamaya gerek yok.
unchecked, bu nedenle, açıkça değiştirmedikçe, uncheckedanahtar kelimeye (bu cevapta ve @ ChrisMarisic'in yorumunda gösterildiği gibi) gerek yoktur ve int myIntValue = (int)myLongValuetam olarak eşdeğerdir. Ancak, uncheckedanahtar kelimeyi kullanıp kullanmadığınıza bakılmaksızın, @TJCrowder tarafından tanımlanan ve işaretin bazı taşma durumlarında dönebileceği matematiksel olmayan kaba kesme davranışını elde ettiğinizi unutmayın. Matematiksel doğruluğu gerçekten sağlamanın tek yolu checked(...), bu durumların bir istisna oluşturacağı bağlamı kullanmaktır .
Convert.ToInt32(myValue);
Rağmen int.MaxValue büyük olduğunda ne yapacağını bilmiyorum.
OverflowExceptionOP atacak tam olarak ne atar : msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convertiyi değil.
if (value > Int32.MaxValue) return Int32.MaxValue; else return Convert.ToInt32( value );
Bazen gerçek değerle değil, checksum / hashcode olarak kullanılmasıyla ilgilenirsiniz . Bu durumda, yerleşik yöntem GetHashCode()iyi bir seçimdir:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCodeuygun bir seçimdir. Eğer bir sonraki ise kalıcı sağlama - ilerde uygulamayı çalıştırdığınızda aynı olacaktır bir değere, o zaman kullanmayın GetHashCodesonsuza aynı algoritma olması garanti edilmez olarak.
Güvenli ve hızlı yol, yayınlamadan önce Bit Maskelemeyi kullanmaktır ...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
Bit Maskesi ( 0xFFFFFFFF) değeri Int boyutuna bağlı olacaktır, çünkü Int boyutu makineye bağlıdır.
uncheckedbağlamda bir taşma olmaz - ancak uncheckedtaşmayı önlemek için maskelenmeniz gerekmez , bu nedenle sadece checkedbağlamda bir çözüme ihtiyaç vardır .] 16 bitlik örnek. İşaretli 16 bitlik ambarlar (-32768, 32767). 0xFFFF ile maskeleme, 65535'e kadar değere izin vererek taşmaya, IIRC'ye neden olur. Yalnızca pozitif istiyorsanız işaret biti, 0x7FFF veya 0x7FFFFFFF önlemek için maske olabilir.
Tarafından dönüştürebilirsiniz
Convert.ToInt32 yöntemi
Ancak, değer Int32 Türünün aralığının dışındaysa bir OverflowException özel durumu atar. Temel bir test bize nasıl çalıştığını gösterecektir:
long[] numbers = { Int64.MinValue, -1, 0, 121, 340, Int64.MaxValue };
int result;
foreach (long number in numbers)
{
try {
result = Convert.ToInt32(number);
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
number.GetType().Name, number,
result.GetType().Name, result);
}
catch (OverflowException) {
Console.WriteLine("The {0} value {1} is outside the range of the Int32 type.",
number.GetType().Name, number);
}
}
// The example displays the following output:
// The Int64 value -9223372036854775808 is outside the range of the Int32 type.
// Converted the Int64 value -1 to the Int32 value -1.
// Converted the Int64 value 0 to the Int32 value 0.
// Converted the Int64 value 121 to the Int32 value 121.
// Converted the Int64 value 340 to the Int32 value 340.
// The Int64 value 9223372036854775807 is outside the range of the Int32 type.
Burada daha uzun bir açıklama var.
değil mi
(int) Math.Min(Int32.MaxValue, longValue)
matematiksel olarak doğru bir yol olabilir mi?
longValue yakın ifade edilebilen intorijinal değer büyük yollarından biri. Ancak, bunun yerine en önemli bitleri kaybedecek olan çok olumsuz girdilerin aynı muamelesinden yoksundur; karşılaştırmak gerekir Int32.MinValue. Yine de orijinal poster sıkmak istemiyordu.
myIntValueolduğunda negatif sonuçlanabilir . Örneğin, bir işlemi uygularken , birinden diğerinden çıkarmanın sonucunu mutlu bir şekilde çıkaramazsınız ve bunu döndüremezsiniz; bazı değerler için karşılaştırmanız yanlış bir sonuç verir.myLongValue4294967294 => -2-4294967296 => 0CompareTolongint