L'impression short int à l'aide de diverses spécificateurs de format
Veuillez jeter un oeil à ce code:
#include <stdio.h>
int main(void)
{
short s = -1;
printf("sizeof(short) = %lu\n", sizeof(short));
printf("sizeof(int) = %lu\n", sizeof(int));
printf("sizeof(long) = %lu\n", sizeof(long));
printf("s = %hd\n", s);
printf("s = %d\n", s);
printf("s = %ld\n", s);
return 0;
}
Il a donné de sortie :
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 8
s = -1
s = -1
s = 4294967295
Dans la dernière ligne pourquoi s = 4294967295
au lieu de s = -1
que par cette question je suis venu pour savoir que C lorsque la variable est promu, sa valeur reste constante.
OriginalL'auteur rootkea | 2013-02-07
Vous devez vous connecter pour publier un commentaire.
s
est promu à unint
, qui, ici, est de 4 octets type. Ce qui se passe dans tous les 3 cas. Dans les deux premiers, unint
est ce queprintf()
attendent, comme le spécificateur de format est pour un type qui serait passée comme uneint
. Toutefois, dans ce dernier cas, vous avez donné un spécificateur de format qui s'attend à une de 8 octets type.C'est en invoquant un comportement indéterminé.
Dans votre cas, il apparaît avoir des zéros dans la partie supérieure octets de la valeur, effectivement zéro-l'extension à la version 64 bits de la valeur qui a été déjà signe étendu à 32 bits. Cependant, vous ne pouvez pas dépendre du résultat de le faire - c'est peut-être la lecture de la mémoire ou un registre qui n'est pas toujours initialisés. Demain, il pourrait être différent.
La promotion d'arguments ne dépend pas de la chaîne de format, vous devez toujours vous assurer que vous passez les bons arguments pour le format que vous avez spécifié. Donc un
int
ne sera pas promu à unlong
. Vous avez besoin de convertir-le vous-même.Une smart compilateur devrait vous donner un avertissement à ce sujet.
s
obtient tout simplement promuint
alors pourquoi ne pas dans ce dernier cas ? Ainsi, dans le cas 2, j'ai donné un spécificateur de format qui s'attend à une de 4 octets type, mais alors le problème est résolu rapidement par la promotion des
àint
. La même chose peut être fait dans le 3ème cas. Mais il n'est pas. Pourquoi?est promu à un int. Cependant, la fonction essaie de lire un long, ce qui est une taille différente. J'ai essayé d'ajouter des précisions sur ce qui est probablement en passe de produire le résultat que vous voyez.
Merci! Donc, ne vous veux dire à chaque fois
printf
est appelé l'argument est promuint
type quel que soit le type d'argument ? Et d'où vient spécificateur de format dans ce processus ?Comme je le dis dans ma réponse, la chaîne de format n'a pas d'influence sur la promotion. Un court sera toujours promu de la même manière. Si vous pensez à ce sujet, la chaîne de format peut être générée au moment de l'exécution - dans ce cas, le compilateur ne pouvait pas savoir comment promouvoir les arguments. Donc les règles sont fixées à l'avance.
OriginalL'auteur JasonD
La variable ne doit pas être promu à la longue, tout en appelant
printf("s = %ld\n", s);
. La bonne façon de le promouvoir à long estprintf("s = %ld\n", (long) s);
.OriginalL'auteur Sergej Christoforov