Bonjour
le code suivant
ne renvoie pas la mm chose en 7 64 bits et en xp 32 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 long long int code; char strCode[17]; sprintf(strCode, "%016llX", code);
Une idée ?
Merci
Julien
Bonjour
le code suivant
ne renvoie pas la mm chose en 7 64 bits et en xp 32 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 long long int code; char strCode[17]; sprintf(strCode, "%016llX", code);
Une idée ?
Merci
Julien
Bonjour
Je poursuis mes investigations : la fonction :
renvoie la même chose sur les deux plateformes. C'est donc un pb
Code : Sélectionner tout - Visualiser dans une fenêtre à part sprintf(strCode, "%016lX", code);
de conversion d'entier 64 bits.
Comment puis-je corriger cela ?
Julien
J'ai corrigé en faisant la conversion en deux fois : 32 bits par 32 bits.
Si pour ma culture qq un peut me dire pourquoi cette différence, cela m'intéresse.
a+
Julien
Dans le code que tu donnes tu n'initialise pas code, donc il contient n'importe quoi.
arf, dans mon code, c'est correctement initialisé. J'ai mis juste la ligne
qui se comporte différemment puis j'ai rajouté les variables pour que
vous puissiez en connaitre les types.
Julien
A vrai dire je m'en doutais un peu, mais si tu ne postes pas ton code exact, et si tu ne décris pas le problème plus précisément, il y a toutes les chances qu'on ne puisse pas t'aider. Le problème est sans doute dans ce que tu ne montres pas.
Bonjour,
Le long long n'est pas supporté par toutes les versions de sprintf().
Sur le site msdn de Microsoft, le format long long (ll) n'est pas indiqué.
Je vais essayer de vous expliquer:
Votre entier vaut en hexa : 11F71FB04CB.
Votre format : 0x016 => 16 caractères au maximum paddés avec des 0.
16^16, c'est 16 F de suite.
-----11F71FB04CB
FFFFFFFFFFFFFFFF
le plus grand unsigned int, c'est FFFF (65535), le plus grand unsigned long c'est FFFFFFFF. Et le plus grand long long c'est 16 F de suite.
Je noterai au passage qu'avec mon Vista 32b, si je convertis 16^16 en hexa, cela me donne 0. Mais si j'écris dans la calculatrice 16^16 - 1 en hexa cela me donne bien FFFFFFFFFFFFFFFF soit 16 F de suite.
avec le runtime C de microsoft, il ne faut pas utiliser le type long long mais le type __int64 et le format "%I64d" pour être que que cela soit compatible avec toutes les version de la CRT (par exemple, long long int n'est supporté que depuis VS 2010 par MS)
Vincent Rogier.
Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog
Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !
OCILIB (C Driver for Oracle)
Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Bonjour
Merci de votre aide.
J'ai essayé avec
Cela fonctionne. Néanmoins, j'entends beaucoup parler de microsoft
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%016I64X\n", code);
(forcemment puisque je parle d'os microsoft !...) mais ce code va être
utilisé sous linux, dois-je m'attendre à des dysfonctionnement sous linux.
Pour info, je compile avec gcc.
merci
Julien
Sous Linux (et sous toutes les plateformes qui respectent les standards), ce code va afficher "%016I64X".
Si tu veux être standard il faut faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%016llX\n", code);
sous gcc, long long est supporté depuis longtemps et de ce point de vue la , gcc respecte très bien le C99.
Par contre le type __int64 et le flag "I64" sont spécifique au runtime C de microsoft.
Fais comme tout le monde, crée toi des macros pour avoir du code portable
Vincent Rogier.
Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog
Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !
OCILIB (C Driver for Oracle)
Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Apparemment, le préfixe "ll" a été introduit par Microsoft seulement à partir de VS2005. -> MSDN
Partager