C# 短错误:求反二进制补码的最小值无效

问题描述 投票:0回答:4

我的项目遇到了这个错误,其中涉及使用数字音频信号。

所以我一直在获取幅度值,最近遇到了这个错误。当调试时遇到的幅度值为“-32768”时,会发生这种情况。我将这些值存储在一个短[]数组中。

我有预感,它与最大/最小值有关(我使用 Math.Abs),但我不确定如何处理它。

有人可以帮忙吗?谢谢!

c# short
4个回答
34
投票

16 位有符号整型 (

short
) 的值介于 -32,768 和 32,767 之间。

在 16 位有符号整数内不可能对 -32768 求负或获取绝对值。该值 (32,768) 大于最大可能的正值 (32,767)。

在不了解您正在使用的算法的更多细节的情况下,我不想建议您如何解决问题。


10
投票

-32768 的绝对值是 +32768...但这超出了

short
的范围...因此出现错误。 (你很幸运,你将此视为一个例外......遇到这种奇怪现象的其他方式可能会产生无声溢出,导致一些非常奇怪的结果)

选项:

  • 此值的特殊情况,例如如果确切的值不太重要,请先转换为-32767
  • 在调用
    int
     之前将其转换为 
    Math.Abs

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
会让这个问题消失。


1
投票

将short[]数组转换为int[]数组。

© www.soinside.com 2019 - 2024. All rights reserved.