Jawaban:
Lakukan saja (int)myLongValue
. Ini akan melakukan apa yang Anda inginkan (membuang MSB dan mengambil LSB) dalam unchecked
konteks (yang merupakan kompiler default). Ini akan melempar OverflowException
dalam checked
konteks jika nilainya tidak cocok dengan int
:
int myIntValue = unchecked((int)myLongValue);
new Random()
gunakan di Environment.TickCount
bawah tenda; tidak perlu seed secara manual dengan tick tick.
unchecked
, jadi kecuali Anda telah mengubahnya secara eksplisit, maka unchecked
kata kunci (seperti yang ditunjukkan dalam jawaban ini dan komentar @ ChrisMarisic, dll.) Tidak diperlukan, dan int myIntValue = (int)myLongValue
sama persis. Namun perlu dicatat bahwa terlepas dari apakah Anda menggunakan unchecked
kata 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
Convert
tidak 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();
GetHashCode
adalah 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.
unchecked
konteks Anda tidak akan mendapatkan overflow - tetapi Anda tidak perlu menutupi unchecked
untuk menghindari overflow, jadi solusi hanya diperlukan dalam checked
konteks.] 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?
longValue
ke representable terdekat int
jika 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.MinValue
juga. Namun, poster aslinya sepertinya tidak ingin dijepit.
myIntValue
bisa berakhir negatif ketikamyLongValue
positif (4294967294 => -2
) dan sebaliknya (-4294967296 => 0
). Jadi, ketika mengimplementasikanCompareTo
operasi, misalnya, Anda tidak bisa dengan senang hati menyerahkan hasil dari mengurangi satulong
dari yang lain keint
dan mengembalikannya; untuk beberapa nilai, perbandingan Anda akan menghasilkan hasil yang salah.