Como formatar um unsigned long long int usando printf?
-
08-06-2019 - |
Pergunta
#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;
}
Saída:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Eu suponho que este inesperado resultado é a impressão de que o unsigned long long int
.Como você printf()
um unsigned long long int
?
Solução
Use o ll (el-el) longo-longo modificador com o u (não assinado) a conversão.(Funciona em windows, GNU).
printf("%llu", 285212672);
Outras dicas
Você pode querer tentar usar a inttypes.h biblioteca que lhe dá tipos, tais como
int32_t
, int64_t
, uint64_t
etc.Em seguida, você pode usar suas macros, tais como:
uint64_t x;
uint32_t y;
printf("x: %"PRId64", y: %"PRId32"\n", x, y);
Este é "garantido" para não lhe dar o mesmo problema como long
, unsigned long long
etc, desde que você não tem que adivinhar quantos bits são em cada tipo de dados.
%d
--> para int
%u
--> para unsigned int
%ld
--> para long int
%lu
--> para unsigned long int
%lld
--> para long long int
%llu
--> para unsigned long long int
Para longo (ou __int64) usando MSVS, você deve usar %I64d:
__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b); //I is capital i
Isso é porque %oll não funciona corretamente no Windows e %d não pode manipular números inteiros de 64 bits.Eu sugiro usar o PRIu64 e você vai descobrir que é portátil para o Linux.
Tente isso:
#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;
}
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
Apesar de eu ter encontrado ele não funciona no Windows 2000, não parece ser um bug lá!
Compilar como x64 com VS2005:
%oll funciona bem.
Não-padrão as coisas são sempre estranho :)
para a longa porção
sob o GNU é L
, ll
ou q
e no windows eu acredito que é ll
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);
Em seguida, a sua versão do mingw não padrão c99.Adicionar este sinalizador de compilador: -std=c99
.
Bem, é uma maneira de compilar como x64 com o VS2008
Este é executado como seria de esperar:
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 a versão de 32 bits de código, precisamos usar o correto __int64 especificador de formato %I64u.Torna-se assim.
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 ambos os 32 e 64 bits VS compilador.
Aparentemente, ninguém chegou com um multi-plataforma* solução para mais de uma década desde o ano de 2008, portanto, vou acrescentar minas 😛.Plz vote positivamente.(Brincando.Eu não me importo.)
Solução: lltoa()
Como usar:
#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 exemplo:
#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;
}
Ao contrário da %lld
impressão de caracteres de formato, isso funciona para mim em 32 bits do GCC no Windows.
*) Bem, quase multi-plataforma.No MSVC, aparentemente você precisa _ui64toa()
em vez de lltoa()
.