Comment avez-vous printf un long long unsigned int (le spécificateur de format pour longtemps à long unsigned int)?

voix
286
#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'imprimer le unsigned long long int. Comment avez - vous printf()une unsigned long long int?

Créé 05/08/2008 à 21:59
source utilisateur
Dans d'autres langues...                            


11 réponses

voix
380

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

printf("%llu", 285212672);
Créé 05/08/2008 à 22:02
source utilisateur

voix
71

Vous pouvez essayer d' utiliser la bibliothèque inttypes.h qui vous donne types tels que int32_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 « garantie » de ne pas vous donner le même problème que long, unsigned long longetc., puisque vous n'avez pas à deviner combien de bits sont dans chaque type de données.

Créé 12/08/2008 à 12:07
source utilisateur

voix
34

Pendant longtemps, longtemps (ou __int64) en utilisant VSM, vous devez utiliser% I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Créé 06/09/2009 à 15:26
source utilisateur

voix
30

%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

Créé 13/05/2015 à 17:48
source utilisateur

voix
29

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

Essayez 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.
Créé 09/09/2008 à 08:54
source utilisateur

voix
9

Sous Linux , il est %lluet sous Windows , il est%I64u

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

Créé 11/09/2008 à 01:57
source utilisateur

voix
8

Compiler comme x64 avec VS2005:

% Llu fonctionne bien.

Créé 11/10/2012 à 07:23
source utilisateur

voix
4

hex:

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

Sortie:

64bit: FFFFFFFFFFFFFFFF
Créé 26/07/2015 à 09:57
source utilisateur

voix
4

choses non standard sont toujours étrange :)

pour la partie longue longue sous GNU il est L, llouq

et sous windows , je crois qu'il est llseulement

Créé 05/08/2008 à 22:03
source utilisateur

voix
2

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

  • 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 ne fait pas défaut à C99. Ajouter ce drapeau du compilateur: -std=c99.

Créé 17/01/2016 à 12:27
source utilisateur

voix
1

Eh bien, d'une façon est de le compiler comme x64 avec VS2008

Cela fonctionne comme on peut s'y attendre:

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);

32 bit code, il faut utiliser le format correct __int64 spécificateur% I64u. Ainsi, 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 32 et 64 bits VS compilateur.

Créé 05/08/2008 à 22:40
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more