Ce code imprime B2
short a=-5; unsigned short b=-5u; if(a==b) printf("A1"); else printf("B2");
3 Réponses :
unsigned short b=-5u;
Re "sur un système de complément de deux deux", c'est ainsi que cette façon est ainsi quelle que soit la représentation entière signée, car la norme sainte exige qu'elle soit binaire, et que 5 est très plus petite que la plage minimale requise, et parce que la norme nécessite non signé. L'arithmétique doit être modulo 2 ^ n où n est le nombre de bits de représentation. Donc, pour, disons, 32 bits non signé code> et 16 bits
non signé court code> l'expression
-5u code> en elle-même donne la valeur 2 ^ 32-5 , puis cette valeur modulo 2 ^ 16 est nécessairement 2 ^ 16-5. Encore une fois, quelle que soit la représentation entière signée.
@ Cheersandhth.-Alf d'accord, j'ai supprimé cette phrase juste avant votre commentaire. J'ai commencé avec le système sur un système de complément de deux i> parce que j'ai initialement voulu ajouter des informations sur le changement de représentation (NON).
Les promotions sont préférées sur les conversions en raison du classement. Les promotions se produisent lors des opérations arithmétiques et autres. Les conversions se produisent lors de la conservation simplement d'un type intégral à l'intérieur d'une autre. Les OP arithmétiques peuvent provoquer des conversions ainsi que des promotions, afin de contraindre les types ensemble. Pour un autre exemple: p> Votre valeur est convertie en une valeur plus grande car elle enveloppe en raison d'être court code> à
abrégé non signé est une conversion (ayant un rang de conversion)
court code> à
int code> int code> est une promotion (donc ayant un rang de promotion) p>
i code> est converti (non promu) sur
non signé code>. P>
non signé code>. Ensuite, ils sont promus par
int code>. Ainsi,
a! = B code> à cause de cela. P> p>
Parcourons votre code:
if( a == b )
Je ne dirais pas -5u code> n'a aucun sens - il est bien défini par la norme.
Um, -5u code> est parfaitement sensible. Il applique
- code> à la constante d'entier
5U code>.
Vous avez frappé un point qui m'intéresse: Donc, avant -5 est stocké dans la courte variable "A" ... sa valeur constante est traitée comme un entier, non? Je suis profondément intéressé par ce point
@Petebecker a mis à jour la réponse au compte pour cela; Cela ne m'était pas venu. Et Johnny, oui, c'est un entier. Ou vous pouvez utiliser 5L pour en faire un long, ou 5UL pour en faire un peu non signé longtemps, par exemple. Notez également qu'un bon compilateur compliquera cette extrême, mais pas d'une manière qu'il est possible de remarquer.
@JohnnyPauling: -5 est converti en Int signé avant sa cession. Il est alors tronqué à un court, mais c'est bien dans ce cas.
Le - code> ne provoquera aucune conversion du
5U code>. Il restera un
non signé INT code>. Appliquer
- code> se traduira par
uint_max - 4 code>, puis converti en
non signé court code>.
@ERICPOSTPISCHIL Je répondais à Dave: "Et le - code> va promouvoir cela (je présume un
long code>) avec la valeur
-5 code>."
@Danielfischer semble avoir raison. Je mettez à nouveau la réponse à nouveau,
Quel compilateur utilisez-vous?
Ce pourrait être utile.
La promotion entière ne se produit que dans le
A == B code> L'expression - est-ce que tout ce que vous demandez?
MSVC2012 mais j'aimerais savoir comment un compilateur de suivi standard se comporterait
Je ne suis pas sûr de ce que vous attendez, il ne sera jamais égal car
abrégé non signé b = -5u code> enveloppera sur
65531 code>.
Dupliqué possible de Unsigné devient signé dans les comparaisons if-relevé?
Voir aussi Conversions arithmétiques habituelles de Stephan T. Lavavej sur Channel 9