web-dev-qa-db-fra.com

format printf pour __int64 non signé sous Windows

J'ai besoin d'imprimer une valeur ULONGLONG (unsigned __int64). Quel format dois-je utiliser dans printf? J'ai trouvé %llu dans une autre question mais ils disent que c'est pour Linux uniquement.

Merci de votre aide.

20
Virus721

L'utilisation de Google pour rechercher "Visual Studio printf unsigned __int64" produit cette page comme premier résultat, ce qui indique que vous pouvez utiliser le préfixe I64, donc le spécificateur de format serait %I64u.

32
Eric Postpischil

%llu est la méthode standard pour imprimer unsigned long long, ce n'est pas seulement pour Linux, c'est en fait en C99. Le problème est donc en fait d'utiliser un compilateur compatible C99, c'est-à-dire pas Visual Studio.

C99 7.19.6 Fonctions d'entrée/sortie formatées

ll (ell-ell) Spécifie qu'un spécificateur de conversion d, i, o, u, x ou X suivant s'applique à un argument long long int ou long long int non signé; ou qu'un spécificateur de conversion n suivant s'applique à un pointeur sur l'argument long long int.

9
Yu Hao

Je vous recommande d'utiliser PRIu64 format spécifié à partir d'une bibliothèque C standard. Il a été conçu pour fournir aux utilisateurs un spécificateur de format pour un entier 64 bits non signé sur différentes architectures.

Voici un exemple (en C, pas en C++):

#include <stdint.h>   /* For uint64_t */
#include <inttypes.h> /* For PRIu64 */
#include <stdio.h>    /* For printf */
#include <stdlib.h>   /* For exit status */

int main()
{
    uint64_t n = 1986;
    printf("And the winning number is.... %" PRIu64 "!\n", n);
    return EXIT_SUCCESS;
}
4
user405725

Printf a différents spécificateurs de format pour unsigned long long selon le compilateur, j'ai vu %llu et %Lu. En général, je vous conseille d'utiliser std::cout et similaire à la place.

1
Ivaylo Strandjev

Voici un travail autour de la sortie HEX

printf("%08X%08X", static_cast<UINT32>((u64>>32)&0xFFFFFFFF), static_cast<UINT32>(u64)&0xFFFFFFFF));
0
Neil Kirk