С# Короткая ошибка: отклонение минимального значения двоичного кода недействительно

Я столкнулся с этой ошибкой для своего проекта, который включает в себя работу с цифровыми аудиосигналами.

Итак, я получаю значения амплитуды и недавно столкнулся с этой ошибкой. Это происходит, когда встреченное значение амплитуды составляет "-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 [].