【问题标题】:Cannot cast int32 to int16. Int16 type value is too large or too small无法将 int32 转换为 int16。 int16 类型值太大或太小
【发布时间】:2015-02-24 07:18:35
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 我已经修复了你的标签 - OverflowExceptionStackOverflowException非常不同的。
  • 您收到 overflowException 错误,因为您的 int32 值大于 Int16.MaxValue 或小于 Int16.MinValue。
  • IMO 如果我必须在强制转换之前检查限制或使用 try..catch,那将不是很好,因为代码会更长。
  • Dim num2 As Int16 = CShort(IIf((num And &HFFFF) < 32768, (num And &HFFFF), (num And &HFFFF) - 65536))

标签: vb.net casting overflowexception


【解决方案1】:

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

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

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

如果您仍然坚持这样做,最好的解决方法是在转换时从 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

【讨论】:

  • 它产生FFFFFFF68DB,因为ToString默认打印十进制字符串,Remove在这里不太合理。我将转换更正为Dim num2 As Int16 = Convert.ToInt16(num.ToString("X8").Substring(num.ToString("X8").Length - 4, 4), 16),它可以工作。谢谢!
  • 如果您能纠正它以产生正确的输出,我会接受您的回答。 1+的信息
  • @QuangYen:你去吧。
【解决方案2】:

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

在 Visual Studio 集成开发中设置 /removeintchecks 环境

  1. 在解决方案资源管理器中选择一个项目。在项目菜单上,单击属性。有关详细信息,请参阅项目设计器简介。
  2. 单击“编译”选项卡。
  3. 点击高级按钮。
  4. 修改删除整数溢出复选框的值。

而且,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"))

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多