无法将 int32 转换为 int16。 int16类型值太大或太小

Cannot cast int32 to int16. Int16 type value is too large or too small

我想将 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 那么我应该怎么做。

如有任何帮助,我们将不胜感激。

我认为,正如我在评论中所说,您的转换无效,因为 int16 具有 maxValueMinValue,而您的 int32 显然不在两者之间。

尝试以下操作以更清楚地查看您的错误:

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

最好的解决方法是 trim 每次转换时将 int32 的最后 4 F 去掉,如果您仍然坚持这样做的话:

 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

如果您在整个项目中进行强制转换和算术运算(包括除零)时可以忽略 OverflowException,我建议您设置编译器选项 /removeintchecks

To set /removeintchecks in the Visual Studio integrated development environment

  1. Have a project selected in Solution Explorer. On the Project menu, click Properties. For more information, see Introduction to the Project Designer.
  2. Click the Compile tab.
  3. Click the Advanced button.
  4. Modify the value of the Remove integer overflow checks box.

而且,Convert.ToInt16() 仍然会生成 OverflowException,无论该选项如何。要从该选项中受益,您可以改用 CTypeCShort

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