Saya ingin mengonversi long
ke int
.
Jika nilai long
> int.MaxValue
, saya senang membiarkannya membungkus.
Apakah cara terbaiknya?
c#
types
int
type-conversion
long-integer
meskipun
sumber
sumber
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.new Random()
gunakan diEnvironment.TickCount
bawah tenda; tidak perlu seed secara manual dengan tick tick.unchecked
, jadi kecuali Anda telah mengubahnya secara eksplisit, makaunchecked
kata kunci (seperti yang ditunjukkan dalam jawaban ini dan komentar @ ChrisMarisic, dll.) Tidak diperlukan, danint myIntValue = (int)myLongValue
sama persis. Namun perlu dicatat bahwa terlepas dari apakah Anda menggunakanunchecked
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 menggunakanchecked(...)
konteks, di mana kasus-kasus tersebut akan memberikan pengecualian.Meskipun saya tidak tahu apa yang akan dilakukan ketika lebih besar dari int.MaxValue.
sumber
OverflowException
, yang persis apa yang tidak diinginkan OP: msdn.microsoft.com/en-us/library/d4haekc4.aspxConvert
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:sumber
GetHashCode
adalah pilihan yang tepat. Jika Anda mencari checksum yang persisten - nilai yang akan sama ketika Anda menjalankan aplikasi nanti, maka jangan gunakanGetHashCode
, karena itu tidak dijamin akan menjadi algoritma yang sama selamanya.Cara aman dan tercepat adalah menggunakan Bit Masking sebelum ...
Nilai Bit Mask (
0xFFFFFFFF
) akan tergantung pada ukuran Int karena ukuran Int tergantung pada mesin.sumber
unchecked
konteks Anda tidak akan mendapatkan overflow - tetapi Anda tidak perlu menutupiunchecked
untuk menghindari overflow, jadi solusi hanya diperlukan dalamchecked
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
Tapi itu akan melempar OverflowException jika nilainya di luar kisaran Tipe Int32. Tes dasar akan menunjukkan kepada kita cara kerjanya:
Di sini ada penjelasan yang lebih panjang.
sumber
Tidak akan
menjadi cara yang benar, secara matematis?
sumber
longValue
ke representable terdekatint
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 membandingkanInt32.MinValue
juga. Namun, poster aslinya sepertinya tidak ingin dijepit.Solusi berikut akan memotong ke int.MinValue / int.MaxValue jika nilainya di luar batas Integer.
sumber
Cara yang mungkin adalah dengan menggunakan operator modulo untuk hanya membiarkan nilai tetap dalam kisaran int32, dan kemudian melemparkannya ke int.
sumber