[c#] Aucune exception de débordement pour int en C #?


Answers

En C #, une exception OverflowException n'est pas levée (dans VB, l'exception est levée par défaut).

Pour obtenir l'excpetion, vous devez intégrer votre code dans un contexte checked :

byte value = 241;
checked
{
    try 
    {
        sbyte newValue = (sbyte) value;
        Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.", 
            value.GetType().Name, value, 
            newValue.GetType().Name, newValue);
    }
    catch (OverflowException) 
    {
        Console.WriteLine("Exception: {0} > {1}.", value, SByte.MaxValue);
    }
}       

MSDN explique plus en détail:

Pour l'opération arithmétique, de coulée ou de conversion pour lancer une exception OverflowException, l'opération doit avoir lieu dans un contexte vérifié. Par défaut, les opérations arithmétiques et les débordements dans Visual Basic sont vérifiés; en C #, ils ne le sont pas. Si l'opération se déroule dans un contexte non contrôlé, le résultat est tronqué en supprimant les bits de poids fort qui ne rentrent pas dans le type de destination.

Question

J'ai eu cette expérience étrange avec le problème numéro 10 sur le projet Euler (excellent site en passant). La tâche consistait à calculer la somme de tous les nombres premiers inférieurs à deux millions.

J'ai utilisé un int pour la somme, et mon algorithme a produit une réponse, mais quand je l'ai collé pour vérifier la réponse, c'était faux.

Il s'est avéré que le résultat était trop grand pour tenir dans un int, mais cela ne causerait-il pas une erreur de débordement ou quelque chose? Au lieu de cela, il vient de renvoyer une valeur loin de la vraie réponse.

Quand j'ai changé le type à long, tout était Hunky Dory.




J'ai déjà ajouté un cmt, mais c'est peut-être intéressant pour certains d'entre vous:

msdn nous dit:

Le dépassement arithmétique entier génère une exception OverflowException ou supprime les bits les plus significatifs du résultat

mais

Le dépassement arithmétique décimal lève toujours une exception OverflowException.

aussi

Lorsqu'un dépassement d'entier se produit, ce qui se passe dépend du contexte d'exécution, qui peut être coché ou décoché. Dans un contexte vérifié, une exception OverflowException est levée. Dans un contexte non contrôlé, les bits les plus significatifs du résultat sont rejetés et l'exécution continue. Ainsi, C # vous donne le choix de gérer ou d'ignorer le débordement.




Related



Tags

c# c#   overflow