Я хочу преобразовать long
в int
.Можно ли преобразовать long в int?
Если значение long
>int.MaxValue
, я рад разрешить его обернуть.
Каков наилучший способ?
Я хочу преобразовать long
в int
.Можно ли преобразовать long в int?
Если значение long
>int.MaxValue
, я рад разрешить его обернуть.
Каков наилучший способ?
Просто сделайте (int)myLongValue
. Он будет делать именно то, что вы хотите (отбрасывание MSB и принятие LSB) в контексте unchecked
(что является компилятором по умолчанию). Он будет бросать OverflowException
в checked
контексте, если значение не укладывается в int
:
int myIntValue = unchecked((int)myLongValue);
Convert.ToInt32(myValue);
Хотя я не знаю, что он будет делать, когда это больше, чем int.MaxValue.
* «Хотя я не знаю, что он будет делать, когда он больше, чем int.MaxValue» * Он выкинет «OverflowException», что именно то, что OP не хочет: http://msdn.microsoft.com /en-us/library/d4haekc4.aspx –
Проверьте, действительно ли myValue> Integer.Max перед запуском конвертирования, если вам нужно выполнить другую обработку, когда myValue> Integer.Max. Convert.ToInt32 (myValue) будет переполняться (без исключения, я считаю) в противном случае. Этот метод работает и в VB.NET. – TamusJRoyce
Хотя (int) действительно, Convert - лучший ответ. Лучше иметь странные исключения, чем странные данные. –
Иногда вас фактически не интересует фактическое значение, но в его использовании как контрольная сумма/hashcode. В этом случае встроенный метод GetHashCode()
является хорошим выбором:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
Это было давно, так как этот ответ был дан, хотя я хочу укажите, что реализация хэш-кода может отличаться от версий .NET. На самом деле это может не произойти, но нет никакой гарантии, что это значение одинаково для разных приложений/приложений. – Caramiriel
Чтобы добавить к тому, что говорит @Caramiriel: если вы используете * временный * hashcode, во время вашего текущего сеанса приложения, то «GetHashCode» является подходящим выбором. Если вы используете * постоянную контрольную сумму * - значение, которое будет таким же, когда вы запустите свое приложение позже, тогда не используйте 'GetHashCode', поскольку он не гарантированно будет тем же самым алгоритмом навсегда. – ToolmakerSteve
Безопасный и быстрый способ заключается в использовании Bit маскирование перед броском ...
int MyInt = (int) (MyLong & 0xFFFFFFFF)
битовая маска (0xFFFFFFFF
) значение будет зависеть от размера Int, потому что размер Int зависит от машины.
Необходимо решить, что вы хотите, когда результат будет либо переполняться, либо стать отрицательным числом. То, что вы показываете, все равно будет переполняться, IIRC, потому что вы пропускаете знак. [Как упоминалось в другом ответе, в контексте «unchecked» вы не получите переполнение, но вам не нужно маскировать «unchecked», чтобы избежать переполнения, поэтому решение необходимо только в контексте «checked».] Пример для 16 бит. Подписанные 16-битные тэги (-32768, 32767). Маскировка с помощью 0xFFFF позволяет использовать значение до 65535, вызывая переполнение, IIRC. Могут маскироваться, чтобы избежать знакового бита, 0x7FFF или 0x7FFFFFFF, если хотите только положительный. – ToolmakerSteve
Для всех, у кого был тот же вопрос, я сделал: Обратите внимание, что отбрасывание MSB может влиять на * знак * результата. С приведенным выше, 'myIntValue' может оказаться отрицательным, когда' myLongValue' положителен ('4294967294 => -2') и наоборот (' -4294967296 => 0'). Поэтому, например, при реализации операции «CompareTo» вы не можете с радостью отдать результат вычитания одного «длинного» из другого в «int» и вернуть его; для некоторых значений ваше сравнение даст неверный результат. –
+1 используется в 'new Random (unchecked ((int) DateTime.Now.Ticks))' –
@Chris: 'new Random()' использует 'Environment.TickCount' под капотом; нет необходимости посещать вручную часами. –