Я хочу преобразовать long
в int
.
Если значение long
> int.MaxValue
, я рад разрешить его обернуть.
Каков наилучший способ?
Я хочу преобразовать long
в int
.
Если значение long
> int.MaxValue
, я рад разрешить его обернуть.
Каков наилучший способ?
Просто сделайте (int)myLongValue
. Он будет делать именно то, что вы хотите (отбрасывание MSB и принятие LSB) в unchecked
контексте (который является компилятором по умолчанию). Он будет бросать OverflowException
в checked
, если значение не соответствует int
:
int myIntValue = unchecked((int)myLongValue);
Convert.ToInt32(myValue);
Хотя я не знаю, что он будет делать, если он больше, чем int.MaxValue.
Иногда вас фактически не интересует фактическое значение, а используется в качестве контрольной суммы /hashcode. В этом случае встроенный метод GetHashCode()
является хорошим выбором:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
Безопасным и быстрым способом является использование бит-маскирования перед литьем...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
Значение бит-маски (0xFFFFFFFF
) будет зависеть от размера Int, потому что размер Int зависит от машины.
Не
бы(int) Math.Min(Int32.MaxValue, longValue)
быть правильно, математически говоря?
Может конвертировать по
Convert.ToInt32 method
Но он выдаст исключение OverflowException, если его значение находится за пределами диапазона типа Int32. Базовый тест покажет нам, как он работает:
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.
Здесь есть более длинное объяснение.
Следующее решение будет усечено до int.MinValue/int.MaxValue, если значение выходит за пределы целочисленных значений.
myLong < int.MinValue ? int.MinValue : (myLong > int.MaxValue ? int.MaxValue : (int)myLong)