С# Короткая ошибка: отклонение минимального значения двоичного кода недействительно
Я столкнулся с этой ошибкой для своего проекта, который включает в себя работу с цифровыми аудиосигналами.
Итак, я получаю значения амплитуды и недавно столкнулся с этой ошибкой. Это происходит, когда встреченное значение амплитуды составляет "-32768" при отладке. Я сохраняю значения в коротком [] массиве.
У меня есть догадка, что он имеет какое-то отношение к максимальным/минимальным значениям (я использую Math.Abs), но я не уверен, как с ним справиться.
Может кто-нибудь помочь? Спасибо!
Ответы
Ответ 1
16 бит, подписанный int (short
), принимает значения от -32,768 до 32,767.
Отрицание -32768, или получение абсолютного значения, невозможно выполнить внутри 16-разрядного целого числа со знаком. Значение (32,768) больше максимально возможного положительного значения (32 767).
Я не хотел бы советовать вам, как решить проблему, не зная подробностей о алгоритмах, которые вы используете.
Ответ 2
Абсолютное значение -32768 равно +32768... но вне диапазона short
... следовательно, ошибка. (Вам повезло, что вы видите это как исключение... другие способы столкновения с этой странностью могут дать бесшумное переполнение, приводящее к некоторым очень странным результатам)
Параметры:
- Особый случай это значение, например. сначала конвертируйте в -32767, если точное значение не имеет большого значения.
- Преобразуйте его в
int
перед вызовом Math.Abs
Ответ 3
Какое значение у вас будет? нет 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
приведет к тому, что это исчезнет.
Ответ 4
Преобразовать короткий [] массив в массив int [].