21

我的项目一直遇到此错误,其中涉及使用数字音频信号。

所以我一直在获取幅度值,最近遇到了这个错误。当调试时遇到的幅度值为“-32768”时,会发生这种情况。我将值存储在一个短 [] 数组中。

我有一种预感,它与最大/最小值有关(我使用 Math.Abs​​),但我不确定如何处理它。

有人可以帮忙吗?谢谢!

4

4 回答 4

30

16 位带符号的 int ( short) 取值介于 -32,768 和 32,767 之间。

否定 -32768 或获取绝对值是不可能在 16 位有符号整数内完成的。该值 (32,768) 大于最大可能的正值 (32,767)。

在不了解您正在使用的算法的更多细节的情况下,我不想建议您如何解决问题。

于 2011-06-07T12:50:19.520 回答
8

-32768 的绝对值是 +32768 ......但这超出了short......的范围,因此出现错误。(你很幸运,你看到这是一个例外......遇到这种奇怪的其他方式可能会导致无声溢出,导致一些非常奇怪的结果)

选项:

  • 这个值的特殊情况,例如先转换为 -32767,如果确切的值无关紧要
  • int在调用之前将其转换为Math.Abs
于 2011-06-07T12:50:58.337 回答
5

你会有什么价值?没有32768in short-only 32767

当然,您可以编写自己的方法:

public static short LossyAbs(short value)
{
    if(value >= 0) return value;
    if(value == short.MinValue) return short.MaxValue;
    return -value;
}

但这是有损的,因为它有点失去价值。short.MinValue也许一个更好的主意是:如果您打算(可能)否定它,请不要使用它。限制自己-32767会使这种情况消失。

于 2011-06-07T12:51:24.383 回答
1

将 short[] 数组转换为 int[] 数组。

于 2011-06-07T12:53:56.523 回答