J'ai rencontré du code de quelqu'un qui semble croire qu'il y a un problème pour soustraire un entier non signé d'un autre entier du même type lorsque le résultat serait négatif. Ce code comme celui-ci serait donc incorrect même s'il fonctionnait 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éborder, car un résultat qui ne peut pas être représenté par le type entier non signé résultant est réduit modulo le nombre qui est un supérieur à la plus grande valeur pouvant être représentée par le type résultant.
Je suppose que l'on pourrait prendre cette citation comme signifiant que lorsque l'opérande droit 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
au lieu d'utiliser la sémantique signée dépendante 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-il défini du tout?