C: unaire moins opérateur de comportement avec les non signé opérandes

Je n'arrive pas à trouver les parties pertinentes de la norme C entièrement de définir le comportement de l'unaire moins de l'opérateur avec unsigned opérandes.

2003 de la norme C++ (oui, C++, garder avec moi pour quelques lignes) dit dans 5.3.1c7: The negative of an unsigned quantity is computed by subtracting its value from 2^n, where n is the number of bits in the promoted operand.

1999 C standard, cependant, ne comprend pas une déclaration explicite et ne définit pas clairement les unaire - comportement ni dans 6.5.3.3c1,3, ni dans les 6.5c4. Dans ce dernier, il dit Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |, ...) ... return values that depend on the internal representations of integers, and have implementation-defined and undefined aspects for signed types.), qui exclut le moins unaire et les choses semblent rester vague.

Cette question précédente désigne le K&R C ANSI livre, section A. 7.4.5 qui dit The negative of an unsigned quantity is computed by subtracting the promoted value from the largest value of the promoted type and adding one.

Quel serait l'1999, C standard équivalent à la citation ci-dessus dans le livre?

6.2.5c9 dit: A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.

Est ce que c'est? Ou est-il autre chose que je suis absent?

  • Oui, c'est §6.2.5.
  • Les résultats de l' << et >> les opérateurs ne dépend pas de la représentation des nombres entiers. Ils sont définis comme la multiplication et la division par puissances de deux et ne sont bien définis uniquement pour les non-négatif opérandes. << est pas défini pour les opérandes, et >> la mise en œuvre est définie pour les opérandes.
  • "Le négatif d'un unsigned quantité est calculée en soustrayant la promotion de la valeur de la plus grande valeur de l'promu type et l'ajout d'un' -- je sais que mon mathemagical kung fu est faible par rapport à la puissante Ritchie et Stroustrup, mais cela semble être une mauvaise, et peut-être fou, façon de gérer une situation qui est certainement programmeur erreur de 99,9...% du temps. Pourquoi ne pas jeter une erreur de compilation en disant: "vous avez essayé de demander un signe à un type non signé, vous dingus'?
  • Et puis vous auriez pour contourner ce compilateur élégance dans des moyens détournés comme 1 + ~a de fermer le compilateur et quelqu'un ne serait pas comprendre ce que cette expression signifie. 🙂