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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top