Como você imprime um long long int não assinado (o especificador de formato para unsigned long long int)?

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

Saída:

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

Eu suponho que este resultado inesperado é de imprimir o unsigned long long int . Como você printf() um unsigned long long int ?

Use o modificador ll (el-el) long-long com a conversão u (sem sinal). (Funciona no windows, GNU).

 printf("%llu", 285212672); 

Você pode tentar usar a biblioteca inttypes.h que fornece tipos como int32_t , int64_t , uint64_t etc. Você pode então usar suas macros como:

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

Isso é “garantido” para não dar a você o mesmo problema, por long , long e unsigned long long , etc, já que você não precisa adivinhar quantos bits estão em cada tipo de dado.

Por muito tempo (ou __int64) usando o MSVS, você deve usar% I64d:

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

%d -> para int

%u -> para unsigned int

%ld -> por um long int

%lu -> para unsigned long int

%lld -> por long long int

%llu -> por unsigned long long int

Isso porque% llu não funciona corretamente no Windows e% d não pode manipular inteiros de 64 bits. Eu sugiro usar o PRIu64 em vez disso e você descobrirá que ele é portátil para o Linux também.

Tente isso:

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

Saída

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

No Linux é %llu e no Windows é %I64u

Embora eu achei que não funciona no Windows 2000, parece haver um erro lá!

Compile como x64 com o VS2005:

% llu funciona bem.

Coisas não-padrão são sempre estranhas 🙂

para a longa e longa parte sob GNU é L , ll ou q

e sob o Windows eu acredito que é apenas

Hex:

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

Saída:

 64bit: FFFFFFFFFFFFFFFF 

Além do que as pessoas escreveram anos atrás:

  • você pode obter este erro no gcc / mingw:

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

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

Então sua versão do mingw não é padronizada para c99. Adicione este sinalizador de compilador: -std=c99 .

Bem, uma maneira é compilá-lo como x64 com VS2008

Isso é executado como você esperaria:

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

Para código de 32 bits, precisamos usar o especificador de formato __int64 correto% I64u. Então isso se torna.

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

Esse código funciona para o compilador VS de 32 e 64 bits.