我的项目一直遇到此错误,其中涉及使用数字音频信号。
所以我一直在获取幅度值,最近遇到了这个错误。当调试时遇到的幅度值为“-32768”时,会发生这种情况。我将值存储在一个短 [] 数组中。
我有一种预感,它与最大/最小值有关(我使用 Math.Abs),但我不确定如何处理它。
有人可以帮忙吗?谢谢!
16 位带符号的 int ( short
) 取值介于 -32,768 和 32,767 之间。
否定 -32768 或获取绝对值是不可能在 16 位有符号整数内完成的。该值 (32,768) 大于最大可能的正值 (32,767)。
在不了解您正在使用的算法的更多细节的情况下,我不想建议您如何解决问题。
-32768 的绝对值是 +32768 ......但这超出了short
......的范围,因此出现错误。(你很幸运,你看到这是一个例外......遇到这种奇怪的其他方式可能会导致无声溢出,导致一些非常奇怪的结果)
选项:
int
在调用之前将其转换为Math.Abs
你会有什么价值?没有32768
in 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
会使这种情况消失。
将 short[] 数组转换为 int[] 数组。