La norme C99 a des types entiers avec une taille d'octets comme int64_t. J'utilise le code suivant:
#include <stdio.h>
#include <stdint.h>
int64_t my_int = 999999999999999999;
printf("This is my_int: %I64d\n", my_int);
et je reçois cet avertissement du compilateur:
warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’
J'ai essayé avec:
printf("This is my_int: %lld\n", my_int); // long long decimal
Mais je reçois le même avertissement. J'utilise ce compilateur:
~/dev/c$ cc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)
Quel format dois-je utiliser pour imprimer ma variable int sans avoir d'avertissement?
Réponses:
Pour
int64_t
type:pour
uint64_t
type:vous pouvez également utiliser
PRIx64
pour imprimer en hexadécimal.cppreference.com a une liste complète des macros disponibles pour tous les types, y compris
intptr_t
(PRIxPTR
). Il existe des macros distinctes pour scanf, commeSCNd64
.Une définition typique de PRIu16 serait
"hu"
, donc la concaténation implicite à constante de chaîne se produit au moment de la compilation.Pour que votre code soit entièrement portable, vous devez utiliser
PRId32
et ainsi de suite pour l'impressionint32_t
et /"%d"
ou similaire pour l'impressionint
.la source
#define __STDC_FORMAT_MACROS
inclure avantinttypes.h
.PRId64
est une macro qui se traduit en interne par"lld"
. Donc, c'est aussi bien que d'écrireprintf("%lld\n", t);
Voir la description: qnx.com/developers/docs/6.5.0/…ld
. La portabilité est la raison de la macro.La méthode C99 est
Ou vous pouvez lancer!
Si vous êtes coincé avec une implémentation C89 (notamment Visual Studio), vous pouvez peut-être utiliser une source ouverte
<inttypes.h>
(et<stdint.h>
): http://code.google.com/p/msinttypes/la source
#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
Avec C99, le
%j
modificateur de longueur peut également être utilisé avec la famille de fonctions printf pour imprimer des valeurs de typeint64_t
etuint64_t
:La compilation de ce code avec
gcc -Wall -pedantic -std=c99
ne produit aucun avertissement et le programme imprime la sortie attendue:Ceci est conforme à
printf(3)
sur mon système Linux (la page de manuel indique spécifiquement qu'ellej
est utilisée pour indiquer une conversion enintmax_t
ouuintmax_t
; dans mon stdint.h, les deuxint64_t
etintmax_t
sont typés par défaut de la même manière et de la même manière pouruint64_t
). Je ne suis pas sûr que ce soit parfaitement portable sur d'autres systèmes.la source
%jd
prnts anintmax_t
, l'invocation correcte seraitprintf("a=%jd (0x%jx)", (intmax_t) a, (intmax_t) a)
. Il n'y a aucune garantie queint64_t
etintmax_t
sont du même type, et s'ils ne le sont pas, le comportement n'est pas défini.%jd
pour imprimer desint64_t
valeurs si vous les convertir explicitementintmax_t
avant de les transmettre àprintf
:printf("a=%jd\n", (intmax_t)a)
. Cela évite la laideur (à mon humble avis) des<inttypes.h>
macros. Bien sûr , cela suppose que vos supports de mise en œuvre%jd
,int64_t
etintmax_t
, qui ont tous été ajoutés par C99.Venant du monde embarqué, où même uclibc n'est pas toujours disponible, et du code comme
uint64_t myval = 0xdeadfacedeadbeef; printf("%llx", myval);
est en train d'imprimer des conneries ou ne fonctionne pas du tout - j'utilise toujours un petit assistant, qui me permet de vider correctement uint64_t hex:
la source
Dans un environnement Windows, utilisez
sous Linux, utilisez
la source
%lld
est le format delong long int
, qui n'est pas nécessairement le même queint64_t
.<stdint.h>
a une macro pour le format correct pourint64_t
; voir la réponse de ouah .long long
c'est au moins 64 bits, celaprintf("%lld", (long long)x);
devrait fonctionner, sauf peut-être pour -0x8000000000000000, qui ne pourrait pas être représentable commelong long
si ce type n'utilisait pas le complément à deux.long long
).//VC6.0 (386 et mieux)
Cordialement.
la source