C# Short Error: Negating the minimum value of a twos complement number is invalid

爱⌒轻易说出口 提交于 2019-12-17 21:02:25

问题


I have been encountering this error for my project, which involves working with Digital Audio Signals.

So I have been getting the amplitude values and recently encountered this error. This occurs when the amplitude value encountered is "-32768" upon debugging. I am storing the values in a short[] array.

I have a hunch that it has something to do with max/minimum values (I use Math.Abs) but I am unsure on how to handle it.

Can someone help? Thanks!


回答1:


16 bit signed int (short) takes values between -32,768 and 32,767.

Negating -32768, or getting the absolute value, is impossible to do inside a 16 bit signed integer. The value (32,768) is greater than the maximum possible positive value (32,767).

I would not like to advise you how to solve the problem without knowing more details of the algorithms you are using.




回答2:


The absolute value of -32768 is +32768... but that's outside the range of short... hence the error. (You're lucky you're seeing this as an exception... other ways of encountering this oddity can give silent overflow, leading to some very odd results)

Options:

  • Special-case this value, e.g. convert to -32767 first, if the exact value doesn't matter too much
  • Convert it to an int before calling Math.Abs



回答3:


What value would you have it be? there is no 32768 in short - only 32767.

You could write your own method, of course:

public static short LossyAbs(short value)
{
    if(value >= 0) return value;
    if(value == short.MinValue) return short.MaxValue;
    return -value;
}

but this is lossy in that it sort-of loses a value. Perhaps a better idea is: don't use short.MinValue if you intend to (potentially) negate it. Limiting yourself to -32767 would make this go away.




回答4:


Convert short[] array to int[] array.



来源:https://stackoverflow.com/questions/6265381/c-sharp-short-error-negating-the-minimum-value-of-a-twos-complement-number-is-i

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!