440 votes

Comment formater un long int non signé à l'aide de printf ?

#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Sortie :

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

Je suppose que ce résultat inattendu est dû à l'impression du unsigned long long int . Comment faites-vous printf() un unsigned long long int ?

2 votes

Je viens de compiler votre code (avec %llu) avec gcc et la sortie est correcte. Avez-vous passé des options au compilateur ?

2 votes

Notez que la newlib de Samsung Bada ne semble pas supporter "%lld" : developer.bada.com/forum/

1 votes

570voto

John Downey Points 6729

Utilisez le modificateur long-long ll (el-el) avec la conversion u (unsigned). (Fonctionne sous Windows, GNU).

printf("%llu", 285212672);

12 votes

Ou pour être précis, c'est pour GNU libc, et ne fonctionne pas avec le runtime C de Microsoft.

184 votes

Ce n'est pas une affaire de Linux/UNIX, le modificateur de longueur "ll" a été ajouté au C standard en C99, si cela ne fonctionne pas dans le "Microsoft C", c'est parce qu'ils ne sont pas conformes aux normes.

0 votes

Fonctionne en Turbo C++ sur Windows

125voto

Shivam Chauhan Points 1076

%d --> pour int

%u --> pour unsigned int

%ld --> pour long int o long

%lu --> pour unsigned long int o long unsigned int o unsigned long

%lld --> pour long long int o long long

%llu --> pour unsigned long long int o unsigned long long

103voto

Nathan Fellman Points 31310

Vous pouvez essayer d'utiliser la bibliothèque inttypes.h qui vous donne des types tels que int32_t , int64_t , uint64_t etc. Vous pouvez ensuite utiliser ses macros telles que :

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

Il est "garanti" que vous ne rencontrerez pas les mêmes difficultés que long , unsigned long long etc., puisque vous n'avez pas à deviner combien de bits se trouvent dans chaque type de données.

1 votes

Où ces PRId64 , PRId32 macros définies ?

6 votes

@happy_marmoset : ils sont définis dans inttypes.h

8 votes

Je pense que vous avez besoin PRIu64 y PRIu32 pour les entiers non signés.

40voto

Pour les long long (ou __int64) utilisant MSVS, vous devez utiliser %I64d :

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

38voto

Paul Hargreaves Points 1022

C'est parce que %llu ne fonctionne pas correctement sous Windows et que %d ne peut pas gérer les entiers 64 bits. Je vous suggère d'utiliser PRIu64 à la place et vous verrez qu'il est également portable sous Linux.

Essayez plutôt ceci :

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Sortie

My number is 8 bytes wide and its value is 285212672. A normal number is 5.

0 votes

+1 pour la référence à PRIu64, que je n'avais jamais vu, mais cela ne semble pas portable à 64 bit Linux (au moins) parce que PRIu64 se développe en "lu" au lieu de "llu".

9 votes

Et pourquoi cela serait-il mauvais ? Un long est une valeur 64 bits sur Linux 64 bits, comme sur tous les autres systèmes d'exploitation à l'exception de Windows.

0 votes

@BDatRivenhill Linux/Unix utilise LP64 dans lequel le long est de 64 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X