Erreur courte C #: la négation de la valeur minimale d’un nombre de complément à deux n’est pas valide

J’ai rencontré cette erreur pour mon projet, qui implique de travailler avec des signaux audio numériques.

Donc, je reçois les valeurs d’amplitude et j’ai récemment rencontré cette erreur. Cela se produit lorsque la valeur d’amplitude rencontrée est “-32768” lors du débogage. Je stocke les valeurs dans un tableau court [].

J’ai l’impression que cela a quelque chose à voir avec les valeurs max / minimum (j’utilise Math.Abs) mais je ne sais pas comment le gérer.

Quelqu’un peut aider? Merci!

16 bit signé int ( short ) prend des valeurs comsockets entre -32 768 et 32 ​​767.

Négocier -32768 ou obtenir la valeur absolue est impossible à l’intérieur d’un entier signé de 16 bits. La valeur (32 768) est supérieure à la valeur positive maximale possible (32 767).

Je ne voudrais pas vous conseiller sur la façon de résoudre le problème sans connaître davantage de détails sur les algorithmes que vous utilisez.

La valeur absolue de -32768 est +32768 … mais c’est en dehors de la plage de short … d’où l’erreur. (Vous avez de la chance que vous voyiez cela comme une exception… d’autres façons de rencontrer cette bizarrerie peuvent provoquer un débordement silencieux, conduisant à des résultats très étranges.)

Options:

  • Cas particulier de cette valeur, p.ex. convertissez-le d’abord en -32767, si la valeur exacte n’a pas d’importance
  • Convertissez-le en int avant d’appeler Math.Abs

Quelle valeur auriez-vous? il n’y a pas de 32768 en short – seulement 32767 .

Vous pouvez bien sûr écrire votre propre méthode:

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

mais c’est une perte en ce sens qu’il perd en quelque sorte une valeur. Une meilleure idée est peut-être: n’utilisez pas short.MinValue si vous avez l’intention de (potentiellement) le nier. En vous limitant à -32767 , cela disparaîtrait.

Convertissez un tableau court [] en un tableau int [].