2009-05-13 11 views

ответ

170

Просто сделайте (int)myLongValue. Он будет делать именно то, что вы хотите (отбрасывание MSB и принятие LSB) в контексте unchecked (что является компилятором по умолчанию). Он будет бросать OverflowException в checked контексте, если значение не укладывается в int:

int myIntValue = unchecked((int)myLongValue); 
+12

Для всех, у кого был тот же вопрос, я сделал: Обратите внимание, что отбрасывание MSB может влиять на * знак * результата. С приведенным выше, 'myIntValue' может оказаться отрицательным, когда' myLongValue' положителен ('4294967294 => -2') и наоборот (' -4294967296 => 0'). Поэтому, например, при реализации операции «CompareTo» вы не можете с радостью отдать результат вычитания одного «длинного» из другого в «int» и вернуть его; для некоторых значений ваше сравнение даст неверный результат. –

+18

+1 используется в 'new Random (unchecked ((int) DateTime.Now.Ticks))' –

+16

@Chris: 'new Random()' использует 'Environment.TickCount' под капотом; нет необходимости посещать вручную часами. –

25
Convert.ToInt32(myValue); 

Хотя я не знаю, что он будет делать, когда это больше, чем int.MaxValue.

+34

* «Хотя я не знаю, что он будет делать, когда он больше, чем int.MaxValue» * Он выкинет «OverflowException», что именно то, что OP не хочет: http://msdn.microsoft.com /en-us/library/d4haekc4.aspx –

+4

Проверьте, действительно ли myValue> Integer.Max перед запуском конвертирования, если вам нужно выполнить другую обработку, когда myValue> Integer.Max. Convert.ToInt32 (myValue) будет переполняться (без исключения, я считаю) в противном случае. Этот метод работает и в VB.NET. – TamusJRoyce

+3

Хотя (int) действительно, Convert - лучший ответ. Лучше иметь странные исключения, чем странные данные. –

13

Иногда вас фактически не интересует фактическое значение, но в его использовании как контрольная сумма/hashcode. В этом случае встроенный метод GetHashCode() является хорошим выбором:

int checkSumAsInt32 = checkSumAsIn64.GetHashCode(); 
+5

Это было давно, так как этот ответ был дан, хотя я хочу укажите, что реализация хэш-кода может отличаться от версий .NET. На самом деле это может не произойти, но нет никакой гарантии, что это значение одинаково для разных приложений/приложений. – Caramiriel

+1

Чтобы добавить к тому, что говорит @Caramiriel: если вы используете * временный * hashcode, во время вашего текущего сеанса приложения, то «GetHashCode» является подходящим выбором. Если вы используете * постоянную контрольную сумму * - значение, которое будет таким же, когда вы запустите свое приложение позже, тогда не используйте 'GetHashCode', поскольку он не гарантированно будет тем же самым алгоритмом навсегда. – ToolmakerSteve

6

Безопасный и быстрый способ заключается в использовании Bit маскирование перед броском ...

int MyInt = (int) (MyLong & 0xFFFFFFFF) 

битовая маска (0xFFFFFFFF) значение будет зависеть от размера Int, потому что размер Int зависит от машины.

+0

Необходимо решить, что вы хотите, когда результат будет либо переполняться, либо стать отрицательным числом. То, что вы показываете, все равно будет переполняться, IIRC, потому что вы пропускаете знак. [Как упоминалось в другом ответе, в контексте «unchecked» вы не получите переполнение, но вам не нужно маскировать «unchecked», чтобы избежать переполнения, поэтому решение необходимо только в контексте «checked».] Пример для 16 бит. Подписанные 16-битные тэги (-32768, 32767). Маскировка с помощью 0xFFFF позволяет использовать значение до 65535, вызывая переполнение, IIRC. Могут маскироваться, чтобы избежать знакового бита, 0x7FFF или 0x7FFFFFFF, если хотите только положительный. – ToolmakerSteve

 Смежные вопросы

  • Нет связанных вопросов^_^