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.
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
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.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
decimal provoquent la levée d'une instance de OverflowException.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.