Jawaban:
Lakukan saja (int)myLongValue. Ini akan melakukan apa yang Anda inginkan (membuang MSB dan mengambil LSB) dalam uncheckedkonteks (yang merupakan kompiler default). Ini akan melempar OverflowExceptiondalam checkedkonteks jika nilainya tidak cocok dengan int:
int myIntValue = unchecked((int)myLongValue);
new Random()gunakan di Environment.TickCountbawah tenda; tidak perlu seed secara manual dengan tick tick.
unchecked, jadi kecuali Anda telah mengubahnya secara eksplisit, maka uncheckedkata kunci (seperti yang ditunjukkan dalam jawaban ini dan komentar @ ChrisMarisic, dll.) Tidak diperlukan, dan int myIntValue = (int)myLongValuesama persis. Namun perlu dicatat bahwa terlepas dari apakah Anda menggunakan uncheckedkata kunci atau tidak, Anda mendapatkan perilaku pemotongan kasar non-matematis yang dijelaskan oleh @TJCrowder di mana tanda dapat membalik dalam beberapa kasus overflow. Satu-satunya cara untuk benar-benar memastikan kebenaran matematis adalah dengan menggunakan checked(...)konteks, di mana kasus-kasus tersebut akan memberikan pengecualian.
Convert.ToInt32(myValue);
Meskipun saya tidak tahu apa yang akan dilakukan ketika lebih besar dari int.MaxValue.
OverflowException, yang persis apa yang tidak diinginkan OP: msdn.microsoft.com/en-us/library/d4haekc4.aspx
Converttidak baik.
if (value > Int32.MaxValue) return Int32.MaxValue; else return Convert.ToInt32( value );
Terkadang Anda sebenarnya tidak tertarik dengan nilai aktual, tetapi dalam penggunaannya sebagai checksum / kode hash . Dalam hal ini, metode bawaan GetHashCode()adalah pilihan yang baik:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCodeadalah pilihan yang tepat. Jika Anda mencari checksum yang persisten - nilai yang akan sama ketika Anda menjalankan aplikasi nanti, maka jangan gunakan GetHashCode, karena itu tidak dijamin akan menjadi algoritma yang sama selamanya.
Cara aman dan tercepat adalah menggunakan Bit Masking sebelum ...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
Nilai Bit Mask ( 0xFFFFFFFF) akan tergantung pada ukuran Int karena ukuran Int tergantung pada mesin.
uncheckedkonteks Anda tidak akan mendapatkan overflow - tetapi Anda tidak perlu menutupi uncheckeduntuk menghindari overflow, jadi solusi hanya diperlukan dalam checkedkonteks.] Contoh untuk 16-bit. Ditandatangani penahan 16-bit (-32768, 32767). Masking dengan 0xFFFF memungkinkan nilai hingga 65535, menyebabkan overflow, IIRC. Dapat menutupi untuk menghindari bit tanda, 0x7FFF atau 0x7FFFFFFF, jika ingin positif saja.
Itu dapat dikonversi oleh
Metode Convert.ToInt32
Tapi itu akan melempar OverflowException jika nilainya di luar kisaran Tipe Int32. Tes dasar akan menunjukkan kepada kita cara kerjanya:
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.
Di sini ada penjelasan yang lebih panjang.
Tidak akan
(int) Math.Min(Int32.MaxValue, longValue)
menjadi cara yang benar, secara matematis?
longValueke representable terdekat intjika nilai asli untuk besar. Tetapi tidak memiliki perlakuan yang sama dari input yang terlalu negatif, yang akan kehilangan bit paling signifikan sebagai gantinya; Anda perlu membandingkan Int32.MinValuejuga. Namun, poster aslinya sepertinya tidak ingin dijepit.
myIntValuebisa berakhir negatif ketikamyLongValuepositif (4294967294 => -2) dan sebaliknya (-4294967296 => 0). Jadi, ketika mengimplementasikanCompareTooperasi, misalnya, Anda tidak bisa dengan senang hati menyerahkan hasil dari mengurangi satulongdari yang lain keintdan mengembalikannya; untuk beberapa nilai, perbandingan Anda akan menghasilkan hasil yang salah.