Невозможно преобразовать int32 в int16. Значение типа Int16 слишком велико или слишком мало

Я хочу преобразовать значение Int32 в значение Int16. Потеря данных при кастинге для меня не проблема. Но System.OverflowException говорит, что значение типа Int16 слишком велико или слишком мало.

Dim num As Int32 = &HFFFFFFF
Dim num2 As Int16 = Convert.ToInt16(num)
Debug.WriteLine(num.ToString("X4"))
Debug.WriteLine(num2.ToString("X4"))

Если я хочу преобразовать Int32 &HFFFFFFF в &HFFFF, что мне делать.

Любая помощь будет оценена по достоинству.


person Yen NQ    schedule 24.02.2015    source источник
comment
Я исправил ваш тег: OverflowException и StackOverflowException очень разные.   -  person Jon Skeet    schedule 24.02.2015
comment
Вы получаете ошибку overflowException, потому что ваше значение int32 больше, чем Int16.MaxValue, или меньше, чем Int16.MinValue.   -  person Amen Jlili    schedule 24.02.2015
comment
IMO Если мне нужно проверить ограничение или использовать try..catch перед кастингом, это было бы не очень хорошо, так как код будет длиннее.   -  person Yen NQ    schedule 24.02.2015


Ответы (2)


Я думаю, как я сказал в своем комментарии, что ваше приведение недействительно, потому что int16 имеет maxValue и MinValue, между которыми ваш int32 явно не находится.

Попробуйте следующее, чтобы увидеть свою ошибку более четко:

 Debug.WriteLine(Int16.MaxValue.ToString)
 Debug.WriteLine(Int16.MinValue.ToString)
 Debug.WriteLine(num.ToString)

введите здесь описание изображения

Ваш лучший обходной путь - обрезать последние 4 F из вашего int32 при каждом преобразовании, если вы все еще настаиваете на этом:

 Sub Main()
        Dim num As Int32 = &HFFFFFFF
        Dim num2 As Int16 = Convert.ToInt16(num.ToString("X8").Substring(num.ToString("X8").Length - 4, 4), 16)
        Debug.WriteLine(num.ToString("X4"))
        Debug.WriteLine(num2.ToString("X4"))
        Console.ReadLine()
    End Sub
person Amen Jlili    schedule 24.02.2015
comment
Он выдает FFFFFFF и 68DB, так как ToString по умолчанию печатает десятичную строку, а Remove здесь не совсем разумно. Исправляю преобразование в Dim num2 As Int16 = Convert.ToInt16(num.ToString("X8").Substring(num.ToString("X8").Length - 4, 4), 16) и все работает. Спасибо! - person Yen NQ; 02.03.2015
comment
Я приму ваш ответ, если вы сможете исправить его, чтобы получить правильный результат. 1+ за информацию - person Yen NQ; 02.03.2015
comment
@QuangYen: Ну вот. - person Amen Jlili; 02.03.2015

Если вы можете игнорировать OverflowException при приведении и арифметических операциях (включая деление на ноль) во всем проекте, я бы посоветовал вам установить параметр компилятора /removeintchecks.

Чтобы установить /removeintchecks в интегрированной среде разработки Visual Studio

  1. Выберите проект в обозревателе решений. В меню Проект щелкните Свойства. Дополнительные сведения см. в разделе Введение в конструктор проектов.
  2. Щелкните вкладку Компиляция.
  3. Нажмите кнопку «Дополнительно».
  4. Измените значение флажка Удалить целочисленное переполнение.

И Convert.ToInt16() по-прежнему генерирует OverflowException независимо от этой опции. Чтобы воспользоваться этой опцией, вы можете использовать вместо нее CType или CShort.

Dim num As Int32 = &HFFFFFFF
Dim num2 As Int16 = CType(num, Int16)
Debug.WriteLine(num.ToString("X4"))
Debug.WriteLine(num2.ToString("X4"))
person Ripple    schedule 24.02.2015