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