2008-10-03 11 views
9

Tengo un código c (++) que usa sprintf para convertir un uint_64 en una cadena. Esto debe ser portátil tanto para Linux como para Solaris.printf + uint_64 en Solaris 9?

En Linux utilizamos% ju, pero no parece haber ningún equivalente en Solaris. Lo más cerca que puedo encontrar es% lu, pero esto produce resultados incorrectos. Algunos código de muestra:

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

En Linux, la salida es la esperada; en Solaris 9 (no preguntes), es "28"

¿Qué puedo usar?

Respuesta

11

Si usted tiene que inttypes.h disponible Puede utilizar las macros que presta:

printf( "%" PRIu64 "\n", val); 

No es bonita (I parecen estar diciendo que una gran cantidad recientemente), pero funciona.

+0

¡Impresionante! Esto funcionó perfectamente. ¡Gracias! –

0

Puede usar %llu por mucho tiempo. Sin embargo, esto tampoco es muy portátil, ya que no se garantiza que long long sea de 64 bits. :-)

0

Puede obtener uint64_t de stdint.h si desea evitar el tipo condicional de SunOS def.

+0

Pero también necesita PRIu64 desde , y eso incluye . –

+0

Buen punto, gracias Jonathan :) –

2

La respuesta depende de si su código es realmente C o C++. En C, debe usar un unsigned long long en lugar de otro tipo (esto es conforme al estándar actual, y long long es bastante común en lo que respecta al soporte C99), agregando ULL en lugar de L a su constante y utilizando (como se ha mencionado) %llu como su especificador. Si el soporte para C99 no existe, es posible que desee verificar la documentación del compilador, ya que no existe otra forma estándar de hacerlo. long long se garantiza que es de 64 bits como mínimo.

+2

uint64_t es tan estándar como unsigned long long. –

7

En un sistema compatible con C99:

#include <inttypes.h> 

uint64_t big = ...; 
printf("%" PRIu64 "\n", big); 

Véase la sección 7.8 de la norma C99.

Los especificadores son {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}

Dónde PRI es para la familia printf(), SCN es para la familia scanf(), d y yo para los tipos integrales firmados; o, u, x, X son para tipos integrales sin signo como octal, decimal, hexadecimal y hexadecimal; N es uno de los anchos admitidos; LEAST y FAST corresponden a esos modificadores; PTR es para intptr_t; y MAX es para intmax_t.