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