Question

#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 de l'impression de l' unsigned long long int.Comment faites-vous printf() un unsigned long long int?

Était-ce utile?

La solution

Utiliser le ll (el-el) de long, le long de la touche de modification avec le u (non signé) de conversion.(Fonctionne sous windows, GNU).

printf("%llu", 285212672);

Autres conseils

Vous pouvez essayer d'utiliser le inttypes.h bibliothèque qui vous donne les types comme int32_t, int64_t, uint64_t etc.Vous pouvez alors utiliser des macros telles que:

uint64_t x;
uint32_t y;

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

C'est "garanti" pour ne pas vous donner le même problème que long, unsigned long long etc, puisque vous n'avez pas à deviner combien de bits sont à chaque type de données.

%d--> pour int

%u--> pour unsigned int

%ld--> pour long int

%lu--> pour unsigned long int

%lld--> pour long long int

%llu--> pour unsigned long long int

Pour les long long (ou __int64) à l'aide de MSVS, vous devez utiliser %I64d:

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

C'est parce qu' %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 trouverez que c'est portable pour 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.

Sous Linux il est %llu et sous Windows, il est %I64u

Bien que j'ai trouvé ne fonctionne pas dans Windows 2000, il semble y avoir un bug là!

Compiler comme x64 avec VS2005:

%llu fonctionne bien.

Non-standard, les choses sont toujours étrange :)

pour la longue portion longue de sous GNU c'est L, ll ou q

et sous windows, je crois que c'est ll seulement

Hex:

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

Sortie:

64bit: FFFFFFFFFFFFFFFF

En plus de ce que les gens ont écrit des années auparavant:

  • vous pouvez obtenir cette erreur sur gcc/mingw:

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

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

Ensuite, votre version de mingw n'est pas par défaut c99.Ajouter ce compilateur drapeau: -std=c99.

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

Cela fonctionne comme vous le souhaitez:

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 la version 32 bits de code, nous avons besoin d'utiliser la bonne __int64 spécificateur de format %I64u.De sorte qu'il 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 les versions 32 et 64 bits VS compilateur.

Apparemment, personne n'est venu avec un multi-plateforme* la solution pour les plus d'une décennie depuis [la] l'année 2008, je vais donc ajouter de la mine 😛.Plz upvote.(Blague.Je n'ai pas de soins.)

Solution: lltoa()

Comment l'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));

OP exemple:

#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 à l' %lld format d'impression de la chaîne, celui-ci fonctionne pour moi sous 32 bits GCC sous Windows.

*) Ainsi, presque multi-plateforme.Dans MSVC, apparemment, vous avez besoin _ui64toa() au lieu de lltoa().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top