La printf
fonction prend un type d'argument, tel que %d
ou %i
pour a signed int
. Cependant, je ne vois rien pour une long
valeur.
La printf
fonction prend un type d'argument, tel que %d
ou %i
pour a signed int
. Cependant, je ne vois rien pour une long
valeur.
Réponses:
Mettez une l
(lettre L minuscule) directement avant le spécificateur.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
renvoie la valeur sous la forme -1. Doit être printf("%lu", ULONG_MAX)
non signé aussi longtemps que décrit par @Blorgbeard ci-dessous.
%ld
pour être plus harmonique avec la question OP.
%l
déclenche justewarning: unknown conversion type character 0x20 in format [-Wformat]
Je pense que vous voulez dire:
unsigned long n;
printf("%lu", n); // unsigned long
ou
long n;
printf("%ld", n); // signed long
Sur la plupart des plateformes, long
et int
sont de la même taille (32 bits). Pourtant, il a son propre spécificateur de format:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Pour 64 bits, vous voudriez long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
Oh, et bien sûr, c'est différent sous Windows:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Souvent, lorsque j'imprime des valeurs 64 bits, je trouve utile de les imprimer en hexadécimal (généralement avec des nombres aussi gros, ce sont des pointeurs ou des champs de bits).
unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"
imprimera:
0x00000000DEADBEEF
Au fait, "long" ne veut plus dire grand-chose (sur le x64 traditionnel). "int" est la taille int par défaut de la plate-forme, généralement 32 bits. "long" est généralement de la même taille. Cependant, ils ont une sémantique de portabilité différente sur les anciennes plates-formes (et les plates-formes intégrées modernes!). "long long" est un nombre 64 bits et généralement ce que les gens ont l'intention d'utiliser à moins qu'ils ne sachent vraiment ce qu'ils faisaient en modifiant un morceau de code portable x-platform. Même alors, ils auraient probablement utilisé une macro à la place pour capturer la signification sémantique du type (par exemple uint64_t).
char c; // 8 bits
short s; // 16 bits
int i; // 32 bits (on modern platforms)
long l; // 32 bits
long long ll; // 64 bits
À l'époque, "int" était de 16 bits. On pourrait penser que ce serait maintenant 64 bits, mais non, cela aurait causé des problèmes de portabilité insensés. Bien sûr, même cela est une simplification de la vérité obscure et riche en histoire. Voir wiki: Entier
long
taille 32", c'est toujours vrai. Par exemple, je suis sur Oracle Linux x86_64 / AMD64, et nvcc
un long
est de 8 octets.
Dans le cas où vous cherchez à imprimer unsigned long long
comme moi, utilisez:
unsigned long long n;
printf("%llu", n);
Pour toutes les autres combinaisons, je pense que vous utilisez le tableau du manuel printf , en prenant la ligne, puis l'étiquette de colonne pour le type que vous essayez d'imprimer (comme je le fais printf("%llu", n)
ci-dessus).
Je pense que pour répondre définitivement à cette question, il faudrait connaître le nom et la version du compilateur que vous utilisez et la plate-forme (type de processeur, système d'exploitation, etc.) pour laquelle il compile.