8
votes

Entières Promotion - Quelles sont les étapes

Ce code imprime B2

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");


7 commentaires

Quel compilateur utilisez-vous?


Ce pourrait être utile.


La promotion entière ne se produit que dans le A == B 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 enveloppera sur 65531 .


Dupliqué possible de Unsigné devient signé dans les comparaisons if-relevé?


Voir aussi Conversions arithmétiques habituelles de Stephan T. Lavavej sur Channel 9


3 Réponses :


3
votes
unsigned short b=-5u;

2 commentaires

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é et 16 bits non signé court l'expression -5u 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 parce que j'ai initialement voulu ajouter des informations sur le changement de représentation (NON).



1
votes

court à abrégé non signé est une conversion (ayant un rang de conversion)

court à int int est une promotion (donc ayant un rang de promotion)

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: xxx

i est converti (non promu) sur non signé .

Votre valeur est convertie en une valeur plus grande car elle enveloppe en raison d'être non signé . Ensuite, ils sont promus par int . Ainsi, a! = B à cause de cela.


0 commentaires

9
votes

Parcourons votre code:

if( a == b )


8 commentaires

Je ne dirais pas -5u n'a aucun sens - il est bien défini par la norme.


Um, -5u est parfaitement sensible. Il applique - à la constante d'entier 5U .


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 - ne provoquera aucune conversion du 5U . Il restera un non signé INT . Appliquer - se traduira par uint_max - 4 , puis converti en non signé court .


@ERICPOSTPISCHIL Je répondais à Dave: "Et le - va promouvoir cela (je présume un long ) avec la valeur -5 ."


@Danielfischer semble avoir raison. Je mettez à nouveau la réponse à nouveau,