Quel est le problème avec printf ("% llx")?
J'ai ce bout de code qui remet en question toutes mes connaissances de C.
Ici, j'ai :
int main(void){
unsigned long long int massage ;
scanf("%llX", &massage); //input: 0x1234567890abcdef
printf("%llX", massage);
return 0;
}
Sur mon "64bit - Corei5 - Fedora - GCC" il imprime exactement ce que je nourris. mais sur mon copain (système 32 bits, MS XP, MinGW), il imprime 90ABCDEF
. Je ne comprends pas pourquoi. personne ne sait?
BTW: sizeof(unsigned long long int)
sur sa système est 8.
source d'informationauteur Untitled
Vous devez vous connecter pour publier un commentaire.
La question est un décalage entre ce que le compilateur croit (comme en témoigne l'
sizeof
:sizeof(unsigned long long int)
est évaluée au moment de la compilation) et ce que la bibliothèque run-time croit (comme en témoigne l'printf
: leprintf
fonction est appelée au moment de l'exécution, de sorte que lorsque son format spécificateurs de prise d'effet).Selon "C99" dans la documentation MinGW:
(La solution de contournement qu'il mentionne est d'utiliser
I64
au lieu dell
: donc,%I64X
. Fâcheusement, au moins sur mon système, GCC affiche un message d'avertissement lorsqu'il voit que dans un littéral de chaîne de formatage, car il suppose qu'il a un mieux la bibliothèque run-time.)Les Fenêtres de la bibliothèque C utilise "%I64d", et non "%lld", pour imprimer des arguments de
de type "long long".
Ref: http://gcc.gnu.org/ml/gcc-patches/2004-11/msg01966.html