Yanıtlar:
Sadece yap (int)myLongValue
. Tam olarak istediğinizi yapar (MSB'leri atar ve LSB'leri alır) unchecked
bağlamda (derleyici varsayılanıdır). Değer aşağıdakilere uymuyorsa bağlam OverflowException
içinde atar :checked
int
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, unchecked
anahtar kelimeye (bu cevapta ve @ ChrisMarisic'in yorumunda gösterildiği gibi) gerek yoktur ve int myIntValue = (int)myLongValue
tam olarak eşdeğerdir. Ancak, unchecked
anahtar 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.
OverflowException
OP atacak tam olarak ne atar : msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convert
iyi 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();
GetHashCode
uygun 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 GetHashCode
sonsuza 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.
unchecked
bağlamda bir taşma olmaz - ancak unchecked
taşmayı önlemek için maskelenmeniz gerekmez , bu nedenle sadece checked
bağ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 int
orijinal 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.
myIntValue
olduğ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.myLongValue
4294967294 => -2
-4294967296 => 0
CompareTo
long
int