Je suis tombé sur le code de quelqu'un qui semble croire qu'il y a un problème à soustraire un entier non signé d'un autre entier du même type lorsque le résultat serait négatif. Ainsi, un code comme celui-ci serait incorrect même s'il se trouve fonctionner sur la plupart des architectures.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
C'est la seule citation vaguement pertinente de la norme C que j'ai pu trouver.
Un calcul impliquant des opérandes non signés ne peut jamais dépasser, car un résultat qui ne peut pas être représenté par le type d'entier non signé résultant est résultant est réduit modulo le nombre qui est supérieur d'une unité à la plus grande valeur valeur qui peut être représentée par le type résultant.
Je suppose que l'on pourrait interpréter cette citation comme signifiant que lorsque l'opérande de droite est plus grand, l'opération est ajustée pour être significative dans le contexte des nombres tronqués modulo.
c'est-à-dire
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
par opposition à l'utilisation de la sémantique de signature dépendant de l'implémentation :
0x0000 - 0x0001 == (non signé)(0 + -1) == (0xFFFF mais aussi 0xFFFE ou 0x8001)
Quelle ou quelle interprétation est la bonne ? Est-elle définie du tout ?
4 votes
Le choix des mots dans la norme est malheureux. Le fait qu'il "ne peut jamais déborder" signifie qu'il ne s'agit pas d'une situation d'erreur. En utilisant la terminologie de la norme, au lieu de déborder, la valeur "s'enroule".