Parcours
/
C#
C#
/
Programme
/
Dépassement
Dé

Dépassement en C#

1 exercice

À propos de Dépassement

L'exercice montre le comportement de différents types numériques lorsqu'ils débordent, c'est-à-dire lorsque leur capacité est insuffisante pour contenir la valeur résultant d'un calcul comme une opération arithmétique ou un cast.

  • Les entiers non signés (byte, ushort, uint, ulong) rebouclent vers zéro (la valeur maximale du type + 1 agit comme un modulo), sauf, en règle générale, s'ils apparaissent dans un bloc checked, auquel cas une instance de OverflowException est levée. int et long se comportent de la même manière, sauf qu'ils rebouclent respectivement vers int.MinValue et long.minValue.
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • Si une expression littérale entraîne un débordement de la variable à laquelle elle est affectée, une erreur de compilation se produit.
  • L'état checked ne s'applique qu'aux expressions directement dans le bloc. Les états de débordement dans les fonctions appelées ne sont pas interceptés.
  • Les types float et double adoptent un état d'infini qui peut être testé avec float.IsInfinity(), etc.
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • Les nombres de type decimal provoquent la levée d'une instance de OverflowException.
  • Il existe un mot-clé unchecked correspondant pour les cas où tu veux annuler l'effet de unchecked à l'intérieur d'un bloc checked, ou lorsque l'option du compilateur a été utilisée.

Les débordements qui se produisent sans qu'une exception soit levée peuvent poser problème, car en règle générale, plus une condition d'erreur peut être signalée tôt, mieux c'est.

Les problèmes de débordement pour int et float peuvent être atténués en affectant le résultat à une variable de type long, decimal ou double.

Si les grands entiers sont essentiels à ton code, utiliser le type BigInteger est une option.

Naturellement, il arrive qu'il soit légitime de laisser un entier reboucler, en particulier dans le cas des valeurs non signées. Un cas classique est celui des codes de hachage qui utilisent la largeur de l'entier comme une sorte de modulo.

Dans les bases de code, on constate généralement qu'il n'y a souvent pas de vérification lorsqu'un uint ou un ulong est utilisé comme identifiant, car on estime que cela cause plus de problèmes que cela n'en résout. Cela s'applique aussi lorsque le domaine rend évident qu'aucune très grande valeur ne sera impliquée. Mais regarde ceci pour un récit édifiant.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Dépassement