私のプロジェクトでは、デジタルオーディオ信号の操作を含むこのエラーが発生しています。
だから私は振幅値を取得していて、最近このエラーに遭遇しました。これは、デバッグ時に検出された振幅値が「-32768」の場合に発生します。値をshort[]配列に格納しています。
最大値/最小値(Math.Absを使用)と関係があるという予感がありますが、それをどのように処理するかがわかりません。
誰かが助けることができますか?ありがとう!
16ビットsignedint(short
)は、-32,768〜32,767の値を取ります。
-32768を否定する、または絶対値を取得することは、16ビットの符号付き整数内で行うことはできません。値(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[]配列に変換します。