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.
Il me semblait bien avoir vu cela quelque part :
And of course you won't be at all surprised that Microsoft does it differently; it uses "I64" instead of "ll":Par contre, je ne connais pas les raisons profondes ni les explications car il me semble aussi que le format "%lld" fonctionne dans certains cas que je ne me rappelle plus, peut être une différence de comportement suivant les versions de CRT.Envoyé par ailleurs
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
A tout hasard, code minimaliste :
renvoie "0000011F71FB04CB" en 7 64 bits
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 long long int code; char strCode[17]; code = 1234567890123; sprintf(strCode, "%016llX", code);
et "0000000071FB04CB" en XP 32 bits
essaye avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sprintf(strCode, "%016I64X", code);
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Je viens de faire le test avec un XP 32 bits et un Seven 64 bits et j'obtiens le même résultat :
avec ce code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 0000011F71FB04CB 0000011F71FB04CB
Peut être/probablement un problème de version de CRT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int _tmain(int /*argc*/, _TCHAR* argv [], _TCHAR* envp[]) { long long int code = 1234567890123; printf("%016llX\n", code); printf("%016I64X\n", code); return 0; }
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
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