c - Comment formater un entier long long non signé en utilisant printf?

Translate
#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;
}

Production:

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

Je suppose que ce résultat inattendu provient de l'impression duunsigned long long int. Comment tuprintf()ununsigned long long int?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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

printf("%llu", 285212672);
La source
Translate

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

uint64_t x;
uint32_t y;

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

Ceci est "garanti" pour ne pas vous causer les mêmes problèmes quelong, unsigned long longetc, car vous n'avez pas à deviner le nombre de bits dans chaque type de données.

La source
Translate

%d-> pourint

%u-> pourunsigned int

%ld-> pourlong int

%lu-> pourunsigned long int

%lld-> pourlong long int

%llu-> pourunsigned long long int

La source
Bruno Lee
Translate

Pour 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
La source
Translate

En effet,% llu ne fonctionne pas correctement sous Windows et% d ne peut pas gérer les entiers 64 bits. Je suggère d'utiliser PRIu64 à la place et vous le trouverez é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;
}

Production

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

Sous Linux, c'est%lluet sous Windows c'est%I64u

Bien que j'ai trouvé que cela ne fonctionne pas sous Windows 2000, il semble y avoir un bogue là-bas!

La source
Translate

Compilez-le en x64 avec VS2005:

% llu fonctionne bien.

La source
Translate

Les choses non standard sont toujours étranges :)

pour la longue partie sous GNU c'estL, llouq

et sous les fenêtres je crois que c'estllseulement

La source
Translate

Hex:

printf("64bit: %llp", 0xffffffffffffffff);

Production:

64bit: FFFFFFFFFFFFFFFF
La source
Translate

En plus de ce que les gens ont écrit il y a des années:

  • vous pourriez obtenir cette erreur sur gcc / mingw:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

Alors votre version de mingw n'est pas par défaut c99. Ajoutez cet indicateur de compilateur:-std=c99.

La source
Translate

Eh bien, une façon est de le compiler en x64 avec VS2008

Cela fonctionne comme vous vous en doutez:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

Pour le code 32 bits, nous devons utiliser le spécificateur de format __int64 correct% I64u. Alors ça devient.

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

Ce code fonctionne pour le compilateur VS 32 et 64 bits.

La source
Translate

Apparemment, personne n'a proposé de solution multi-plateforme * pourplus d'une décenniedepuis [l'année] 2008, je vais donc ajouter le mien?. Plz upvote. (Blague. Je m'en fiche.)

Solution:lltoa()

Comment utiliser:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

L'exemple d'OP:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

Contrairement au%lldchaîne de format d'impression, celle-ci fonctionne pour moisous GCC 32 bits sous Windows.

*) Bien,presquemulti plateforme. Dans MSVC, vous avez apparemment besoin_ui64toa()au lieu delltoa().

La source