Могу ли я преобразовать 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)