C#短错误:否定二进制补码数的最小值无效

我的项目遇到了这个错误,涉及使用数字音频信号。

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

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

有人可以帮忙吗? 谢谢!

16位有符号整数( short )取值介于-32,768和32,767之间。

在16位有符号整数内不可能取消-32768或获得绝对值。 值(32,768)大于最大可能正值(32,767)。

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

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

选项:

  • 特殊情况下此值,例如,如果确切值无关紧要,则首先转换为-32767
  • 在调用Math.Abs之前将其转换为int

你有什么价值? short没有32768 – 只有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 []数组。