21

私のプロジェクトでは、デジタルオーディオ信号の操作を含むこのエラーが発生しています。

だから私は振幅値を取得していて、最近このエラーに遭遇しました。これは、デバッグ時に検出された振幅値が「-32768」の場合に発生します。値をshort[]配列に格納しています。

最大値/最小値(Math.Abs​​を使用)と関係があるという予感がありますが、それをどのように処理するかがわかりません。

誰かが助けることができますか?ありがとう!

4

4 に答える 4

30

16ビットsignedint(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

あなたはそれをどのような価値がありますか?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と、これはなくなります。

于 2011-06-07T12:51:24.383 に答える
1

short[]配列をint[]配列に変換します。

于 2011-06-07T12:53:56.523 に答える