C quelle est la forme courte de long unsigned int
lors de la compilation de mon programme avec GCC, je reçois le message d'avertissement suivant:
format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int
Maintenant en jouant je me rends compte %lo corrige le message d'avertissement. Cependant je ne comprends pas vraiment ce que je fais.
Est-il une convention de nommage pour obtenir la forme courte d'un type? Par exemple, l'int est de %d, pourquoi??
Merci!
- La documentation est toujours un bon début: cplusplus.com/reference/clibrary/cstdio/printf
Vous devez vous connecter pour publier un commentaire.
Ce que vous êtes en train de faire est de dire à l'
printf
fonction de la manière d'afficher les données que vous fournissez à la suite de la chaîne de format. Vous trouverez probablement que%lo
n'a pas vraiment d'imprimer les résultats que vous attendez -- il imprime le droit des données, mais en octal (base 8) format.La "forme courte" est appelé un spécificateur de format. Il n'y a pas de convention qui vous permet de tirer le approprié printf spécificateur de format. Vous avez juste à recherchez-les dans une référence appropriée.
Vous utilisez
%lu
pour imprimer ces.Et de la même façon,
%llu
est pourunsigned long long
.La définition de type int, long, etc sont spécifiques à la cible. Si la taille des int et long match, alors un
l'habitude de se plaindre, mais si longtemps est-à-dire 64 bits et int de 32 bits comme un exemple, alors vous obtiendrez l'avertissement/d'erreur que vous décrivez. L'une des deux solutions suivantes:
Pour le dernier, bien sûr, vous avez à s'assurer que le compilateur associe int avec le %d de taille, si vous obtenez encore un autre avertissement puis de l'ajuster en conséquence.
EDIT:
Le compilateur essaie de vous aider, en vous soucier de la bibliothèque C de choses qui ne sont pas vraiment les affaires du compilateur. printf() utilise un nombre variable d'arguments, qui nous l'espérons vous correctement adapté à votre chaîne de format. Quand printf voit un %d, par exemple sur un système 32 bits, il sera probablement seulement à attraper le premier argument de 32 bits. Mais si vous aviez mis un entier de 64 bits en tant que paramètre, il peut saisir la moitié de ce nombre entier, et d'utiliser l'autre moitié de l'élément suivant dans la chaîne de format. Par exemple
Selon votre système, l'endianess, etc, un système 32 bits, vous ne devriez pas être surpris si le code ci-dessus produit la sortie suivante:
parce que c'est ce que vous lui avez dit de faire. vous lui avez dit de prendre les 32 bits de poids faible de l'ul et de l'impression que, comme hex (%X) et la partie supérieure de 32 bits de l'ul et de l'impression qu'en tant que float (%f) et de mettre de f dans l'appel de fonction était une perte de temps vous navez pas fournir toute mise en forme utilisation de la valeur à virgule flottante.
Maintenant, selon le compilateur sur le système cible sur un jour particulier, vous pourriez avoir le code ci-dessus comme on le souhaite, prendre un système/compilateur où unsigned long est interprétée comme une application 32 bits et %X est interprété en 32 bits, alors vous obtenez un avertissement au sujet de la version 64 bits de cession, mais que le printf fait un peu plus de sens.
À cause de cette douleur, de compilateurs comme gcc essayer de rendre votre vie meilleure en supposant que lorsque vous utilisez un appel de fonction printf() vous utilisez le standard C l'un et ils analyser par le biais de votre chaîne de format à la recherche de ces types d'erreurs les plus courantes.
Non, il n'y a convention, vous avez simplement besoin de regardez la documentation.
Et la mise en forme des prescripteurs ne sont pas un mappage 1:1 pour le type, ils contrôlent le format de sortie (d'où le nom). Il peut y avoir plusieurs formats de sortie pour une seule valeur d'entrée type.
Par exemple,
%d
est "décimal", puisqu'il imprime un entier comme un nombre décimal. Il est également%i
("integer") qui fait exactement la même chose.Pour
unsigned int
valeurs, vous avez à la fois%x
(impression en hexadécimal) et%u
(impression en octal).%lo = unsigned long integer imprimé en octale. oui, docs sont un bon endroit pour commencer.. mais somethings ont un motif, comme o pour octal, x hex, l pour rien de temps, etc. S'habituer à beaucoup de ces spécificateurs de format va vous aider à obtenir le patron là où il est.