Bonjour
le code suivant
ne renvoie pas la mm chose en 7 64 bits et en xp 32 ?Code:
1
2
3 long long int code; char strCode[17]; sprintf(strCode, "%016llX", code);
Une idée ?
Merci
Julien
Version imprimable
Bonjour
le code suivant
ne renvoie pas la mm chose en 7 64 bits et en xp 32 ?Code:
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 pbCode: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 :
Citation:
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.Citation:
Envoyé par ailleurs
A tout hasard, code minimaliste :
renvoie "0000011F71FB04CB" en 7 64 bitsCode:
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:sprintf(strCode, "%016I64X", code);
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:
1
2 0000011F71FB04CB 0000011F71FB04CB
Peut être/probablement un problème de version de CRTCode:
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; }
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)
Bonjour
Merci de votre aide.
J'ai essayé avec
Cela fonctionne. Néanmoins, j'entends beaucoup parler de microsoftCode: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: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
Apparemment, le préfixe "ll" a été introduit par Microsoft seulement à partir de VS2005. -> MSDN