Dans plusieurs langages de programmation modernes (y compris C++, Java et C#), le langage permet de dépassement d'entier pour se produire lors de l'exécution sans lever toute sorte de condition d'erreur.
Prenons l'exemple de cette (fictive) C#, qui ne tient pas compte de la possibilité de dépassement de capacité/underflow. (Par souci de concision, la méthode ne gère pas le cas où la liste est référence null.)
//Returns the sum of the values in the specified list.
private static int sumList(List<int> list)
{
int sum = 0;
foreach (int listItem in list)
{
sum += listItem;
}
return sum;
}
Si cette méthode est appelée comme suit:
List<int> list = new List<int>();
list.Add(2000000000);
list.Add(2000000000);
int sum = sumList(list);
Un dépassement de capacité se fera dans le sumList (), méthode (parce que le "int" type en C# est un entier signé 32 bits, et la somme des valeurs dans la liste dépasse la valeur maximale de 32 bits entier signé). La somme de la variable aura une valeur de -294967296 (pas une valeur de 4000000000); ce n'est probablement pas ce que les (hypothétiques) développeur de la sumList méthode destinée.
Évidemment, il existe différentes techniques qui peuvent être utilisées par les développeurs pour éviter la possibilité d'un dépassement d'entier, comme l'utilisation d'un type comme Java BigInteger, ou le vérifiée mot-clé et /vérifié commutateur de compilateur en C#.
Cependant, la question qui m'intéresse est pourquoi ces langues ont été conçus par défaut permettent aux débordements d'entiers de se produire en premier lieu, au lieu de, par exemple, le déclenchement d'une exception lorsqu'une opération est effectuée à l'exécution qui provoque un dépassement de capacité. Il semble que ce type de comportement permettrait d'éviter des bugs dans les cas où un développeur néglige de tenir compte de la possibilité de dépassement de capacité lors de l'écriture du code qui effectue une opération arithmétique qui pourrait entraîner un dépassement de capacité. (Ces langues pourraient avoir compris quelque chose comme un "unchecked" mot-clé qui pourrait désigner un bloc entier où le dépassement est autorisé à se produire, sans exception, dans les cas où ce comportement est explicitement prévu par le développeur, le C# en fait n'ont de ce.)
La réponse n'envisagent performance -- la langue concepteurs ne veulent pas que leurs langues respectives à défaut d'avoir "lente" de l'arithmétique entier des opérations par lesquelles l'exécution aurait besoin de faire du travail supplémentaire pour vérifier si un dépassement de capacité s'est produite, sur chaque applicable opération arithmétique -- et ce facteur de performance, a dépassé la valeur d'éviter le "silence" des échecs dans le cas d'un débordement involontaire se produit?
Existe-il d'autres raisons pour cette langue décision de conception ainsi, autres que des considérations de performance?