Pergunta
Eu tenho algum código C (++) que usa Sprintf para converter um UINT_64 em uma string. Isso precisa ser portátil para Linux e Solaris.
No Linux, usamos %Ju, mas não parece ser equivalente a Solaris. O mais próximo que posso encontrar é %Lu, mas isso produz saída incorreta. Algum código de amostra:
#include <stdio.h>
#include <sys/types.h>
#ifdef SunOS
typedef uint64_t u_int64_t;
#endif
int main(int argc, char **argv) {
u_int64_t val = 123456789123L;
#ifdef SunOS
printf("%lu\n", val);
#else
printf("%ju\n", val);
#endif
}
No Linux, a saída é como esperado; No Solaris 9 (não pergunte), é "28"
O que posso usar?
Solução
Se você tem inttypes.h disponível, pode usar as macros que ele fornece:
printf( "%" PRIu64 "\n", val);
Não é bonito (eu pareço estar dizendo isso muito recentemente), mas funciona.
Outras dicas
Em um sistema compatível com C99:
#include <inttypes.h>
uint64_t big = ...;
printf("%" PRIu64 "\n", big);
Consulte a Seção 7.8 do padrão C99.
Os especificadores são {PRI, SCN} [Diouxx] {n, Menos, Max, Fastn, Ptr}
Onde o PRI é para a família Printf (), o SCN é para a família Scanf (), D e I para tipos integrais assinados; O, u, x, x são para tipos integrais não assinados como octal, decimal, hexadecimal e hexadecimal; N é uma das larguras suportadas; Menos e rápido correspondem a esses modificadores; Ptr é para intptr_t; e Max é para intmax_t.
A resposta depende se o seu código é realmente C ou C ++. Em C, você deve estar usando um unsigned long long
em vez de outro tipo (este está em conformidade com o padrão atual e long long
é bastante comum no que diz respeito ao suporte C99), anexando ULL
ao invés de L
para sua constante e usando (como foi mencionado) %llu
como seu especificador. Se o suporte ao C99 não existir, convém verificar a documentação do compilador, pois não há outra maneira padrão de fazê -lo. long long
é auxiliar em 64 bits, pelo menos.
Você pode usar %llu
por muito tempo. No entanto, isso também não é muito portátil, porque long long
Não é garantido que seja de 64 bits. :-)
Você pode ter uint64_t
a partir de stdint.h
Se você deseja evitar o Sunos Condicional Typedef.