33 votes

Ne devrait-il pas provoquer un Dépassement de capacité? Il n'est pas!

Qu'est-ce cela, de toute façon? - Je faire une simple multiplication:

Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;

Et à la fin de la multiplication, z montre une valeur de:

-5670418394979206991

Cela a clairement débordé, mais aucune exception n'est levée. Je tiens à être soulevée, mais...

Note que c'est sur Windows Phone 7, mais je ne pense pas que cela a une incidence sur la question. Ou est-il?

43voto

Mark Byers Points 318575

Vous pouvez utiliser un contrôle de bloc comme l'a souligné déjà par d'autres réponses:

checked
{
    long x = 11111111111;
    long y = 11111111111;
    long z = checked(x * y);
    // ...
}

Qui entraîne une exception:

OverflowException: opération Arithmétique a entraîné un dépassement de capacité.

Si vous êtes juste faire une seule opération où vous avez besoin de vérifier, vous pouvez utiliser un vérifiée expression à la place:

long x = 11111111111;
long y = 11111111111;
long z = checked(x * y);

Vous pouvez également définir la /cochée l'option de compilateur pour avoir le défaut d'être vérifié.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio:

  1. Ouvrez le projet de Pages de propriétés boîte de dialogue. Pour plus de détails, voir Configuration de Visual C# Propriétés du Projet.
  2. Cliquez sur la Configuration des Propriétés d'un dossier.
  3. Cliquez sur le Construire une page de propriété.
  4. Modifier la Case pour Dépassement de capacité Arithmétique/dépassement de capacité de la propriété.

Si vous modifiez la valeur par défaut est cochée, vous pouvez utiliser décoché des blocs ou des expressions pour obtenir la décoché un comportement nouveau.

26voto

Darin Dimitrov Points 528142

Vérifier:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}

8voto

IVlad Points 20932

Essayez:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}

8voto

this. __curious_geek Points 23728

Compilateur suppose que vous voulez le faire de cette façon et de procéder à la Dépassement de. Si dépassement doit être considéré comme l'exception de l'exploitation, de l'envelopper l'opération autour de checked et il lèvera une exception à l'exécution.

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}

Système.OverflowException: Une exception type de Système.OverflowException a été jetés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X