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. 🙂
Vous devez vous connecter pour publier un commentaire.
Oui, 6.2.5c9 est exactement le point que vous avez cherché.
Le comportement de l'unaire moins de l'opérateur sur unsigned opérandes n'a rien à voir avec une machine utilise en complément à deux arithmétiques avec des nombres signés. Au lieu de cela, étant donné
unsigned int x,y;
la déclarationy=-x;
va provoquery
pour recevoir quelle que soit la valeur qu'elle aurait à tenir pour fairex+y
égaux à zéro. Six
est zéro,y
sera de même être nulle. Pour toute autre valeur dex
, il seraUINT_MAX-x+1
, auquel cas le calcul de la valeur dex+y
seraUINT_MAX+1+(y-y)
qui, lorsqu'ils sont affectés à ununsigned integer
, auraUINT_MAX+1
soustrait de lui, céder à zéro.Dans l'exécution de chaque je connais, un négatif est calculé comme en complément à deux...
...donc il n'y a vraiment pas de différence physique entre négative signé et "négatif" des entiers non signés - la seule différence est dans la façon dont ils sont interprété.
Donc dans cet exemple...
...la
b
etc
vont contenir exactement les mêmes bits. La seule différence est queb
est interprétée comme 2^32-12 (ou 2^64-12), tandis quec
est interprété comme "normal" -12.Donc, un négatif est calculé exactement de la même façon, indépendamment de "signe-ness", et le casting entre unsigned et signé est en fait un no-op (et ne peut jamais causer un dépassement dans un sens que certains bits doivent être "cut-off").