代码之家  ›  专栏  ›  技术社区  ›  Barun

vb.net异常

  •  0
  • Barun  · 技术社区  · 15 年前

    我刚刚将C代码转换为vb.net。它也在例外。

    C代码:

    private static short[] muLawToPcmMap;
    
    decoded[2 * i + 1] = (byte)(muLawToPcmMap[data[i]] >> 8);
    

    VB代码:

    decoded(2 * i + 1) = CByte(muLawToPcmMap(data(i)) >> 8)
    

    例外情况:

    Arithmetic operation resulted in an overflow.
    

    我有很多麻烦。请帮忙。

    4 回复  |  直到 15 年前
        1
  •  7
  •   Adam Sills    15 年前

    您的代码会导致正在处理的数据类型溢出。

    vb.net的默认行为是检查算术运算,而在c中则是不检查算术运算。

    添加一个 checked 围绕C代码的语句也会失败。

    checked {
       // do all your work here, any overflow will cause an exception
    }
    

    修复代码以停止溢出。正如我下面的评论所提到的,算术溢出并不一定要被忽略。您在这里执行的操作可能会导致意外的结果,您应该为此进行显式编码(通过增加类型的大小或处理失败)。

    您应该(IMO)做的最后一件事是在项目属性、编译选项卡、高级编译器设置按钮下,选中标记为“删除整数溢出检查”的复选框。我个人认为这是个坏主意,我个人用 checked 在C中,每当我做一些会溢出变量的事情时。及早失败,经常失败。

        2
  •  1
  •   Matthieu kelly    15 年前

    检查您的翻译是否

    byte[] decoded = new byte[size*2]; 
    

    Dim decoded As Byte() = New Byte(size * 2 - 1) {}
    

    或者不,就像在vb.net中一样,声明数组时使用的是最后一个元素的索引,而不是大小本身。

    根据您如何翻译解码,您必须检查代码的其余部分以使其适应您选择的版本。

        3
  •  0
  •   msarchet    15 年前

    您试图转换的数字很可能不在 Byte Short

    参考文献: link text

        4
  •  0
  •   Mike Hofer    15 年前

    我注意到您的C代码不包含强制转换,但您的vb.net代码包含强制转换。它是 可能的 强制转换将导致位转换为位,从而导致溢出。(看不到数据就无法判断。)删除它。