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

use*_*792 12 c# short

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

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

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

有人可以帮忙吗?谢谢!

Dav*_*nan 22

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

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

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


Jon*_*eet 6

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

选项:

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


Mar*_*ell 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;
}
Run Code Online (Sandbox Code Playgroud)

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