Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 无法将int32强制转换为int16。Int16类型值太大或太小_Vb.net_Casting_Overflowexception - Fatal编程技术网

Vb.net 无法将int32强制转换为int16。Int16类型值太大或太小

Vb.net 无法将int32强制转换为int16。Int16类型值太大或太小,vb.net,casting,overflowexception,Vb.net,Casting,Overflowexception,我想将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转换为&

我想将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具有
maxValue
MinValue
,而您的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

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

在Visual Studio集成开发中设置/删除检查的步骤 环境

  • 在解决方案资源管理器中选择一个项目。在“项目”菜单上,单击“属性”。有关详细信息,请参见项目设计器简介
  • 单击编译选项卡
  • 单击高级按钮
  • 修改删除整数溢出复选框的值
  • 而且,
    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"))
    

    我已经修复了你的标记-
    OverflowException
    StackOverflowException
    非常不同。你得到OverflowException错误是因为你的int32值大于Int16.MaxValue或小于Int16.MinValue.IMO如果我必须检查限制或在施放前使用try..catch,这将不是很好,因为代码会更长。
    Dim num2作为Int16=CShort(IIf((num和&HFFFF)<32768,(num和&HFFFF),(num和&HFFFF)-65536))
    它生成
    FFFFFFF
    68DB
    ,因为
    ToString
    默认情况下打印十进制字符串,而
    删除
    在这里并不太合理。我将转换为
    Dim num2的过程更正为Int16=Convert.ToInt16(num.ToString(“X8”).Substring(num.ToString(“X8”).Length-4,4),16)
    。谢谢我会接受你的答案,如果你能纠正它产生正确的输出。1+用于information@QuangYen:给你。