Comment puis-je imprimer uint32_t et uint16_t variables de la valeur?
Je suis en train d'imprimer un uint16_t et uint32_t valeur, mais il n'est pas de donner de sortie souhaité.
#include <stdio.h>
#include <netinet/in.h>
int main()
{
uint32_t a=12,a1;
uint16_t b=1,b1;
a1=htonl(a);
printf("%d---------%d",a1);
b1=htons(b);
printf("\n%d-----%d",b,b1);
return 0;
}
J'ai aussi utilisé
printf("%"PRIu32, a);
qui affiche une erreur.
Comment faire pour imprimer un de ces valeurs et de ce que sera le résultat souhaité?
- Il serait beaucoup plus utile de nous montrer l' (exact!) message d'erreur plutôt que de simplement dire que c'est "montre l'erreur". Et plutôt que de simplement "ne donnant pas souhaité s/p", de nous montrer la sortie réelle (et épeler le mot "sortie" plutôt que d'écrire "o/p).
printf("%d---------%d",a1);
produit un comportement indéterminé parce que vous avez deux %d dans la chaîne de format, mais seulement de transmettre un paramètre.- Double Possible de les spécificateurs de Format pour u_int8_t, uint16_t, ...?
Vous devez vous connecter pour publier un commentaire.
Vous devez inclure
inttypes.h
si vous souhaitez que tous ceux chouette nouvelle spécificateurs de format pour laintN_t
types et de leurs frères, et que est correcte (c'est à dire, portable) façon de le faire, à condition que votre compilateur est conforme à la C99. Vous ne devriez pas utiliser le standard comme%d
ou%u
dans le cas où les tailles sont différentes de ce que vous en pensez.Il comprend
stdint.h
et l'étend avec pas mal d'autres choses, telles que les macros qui peuvent être utilisés pour lesprintf/scanf
de la famille des appels. Ce point est abordé dans l'article 7.8 de l'ISO standard C99.Par exemple, le programme suivant:
sorties:
Les macros définies dans
<inttypes.h>
sont la plus correcte pour imprimer les valeurs de typesuint32_t
,uint16_t
, et ainsi de suite-mais ils ne sont pas la seule façon.Personnellement, je trouve ces macros difficile de s'en souvenir et difficile à utiliser. (Compte tenu de la syntaxe d'une
printf
chaîne de format, c'est probablement inévitable; je ne dis pas que je pouvais venir avec un meilleur système.)Une alternative est de jeter les valeurs d'un type prédéfini et utiliser le format de ce type.
Types
int
etunsigned int
sont garantis par la langue à au moins 16 bits de large, et, par conséquent, être en mesure de tenir toute valeur convertie de typeint16_t
ouuint16_t
, respectivement. De même,long
etunsigned long
sont au moins 32 bits de large, etlong long
etunsigned long long
sont au moins 64 bits de large.Par exemple, je pourrais écrire votre programme comme ceci (avec quelques ajustements):
Un avantage de cette approche est qu'il peut fonctionner même avec pré-C99 implémentations qui ne supportent pas
<inttypes.h>
. Une telle mise en œuvre ne pourraient probablement pas<stdint.h>
soit, mais la technique est utile pour d'autres types d'entiers.intN_t
types sont nécessaires pour être en complément à deux sans rembourrage bits. Siint
n'est pas en complément à deux, puis leintN_t
types ne sera probablement pas défini moins la mise en œuvre prend en charge distinctes en complément à deux types. Bon point, mais je pense que c'est encore plus mineur bord de cas que vous suggérez.int
type 🙂