Est entier non signé de la soustraction comportement défini?

J'ai trouver le code de quelqu'un qui semble croire qu'il y est un problème de soustraction d'un entier non signé à partir d'un autre nombre entier de même type, alors que le résultat serait négatif. De sorte que le code comme ce serait incorrect, même si elle arrive à travailler 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 vaguement pertinents citation du C standard, j'ai pu trouver.

Un calcul impliquant non signé opérandes ne peut jamais déborder, car un
résultat qui ne peut pas être représenté par la entier non signé
le type est réduit modulo le nombre qui est plus grand que le plus grand
valeur qui peut être représentée par le type résultant.

Je suppose que l'on pourrait prendre cette citation à dire que lorsque l'opérande de droite est plus grande que l'opération est ajusté pour être significatif dans le contexte de modulo tronquée numéros.

c'est à dire

0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF

par opposition à l'aide de la mise en œuvre dépend signé sémantique:

0x0000 - 0x0001 == (unsigned)(0 + -1) == (0xFFFF mais aussi 0xFFFE ou 0x8001)

Qui ou quoi l'interprétation est la bonne? Se définit-elle à tous?

  • Le choix des mots dans la norme est regrettable. Qu'il “ne peut jamais dépassement” signifie qu'elle n'est pas une situation d'erreur. En utilisant la terminologie de la norme, au lieu de faire déborder la valeur de “l'enveloppe.”
InformationsquelleAutor jbcreix | 2011-08-28