Pregunta
Tengo algo de 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.
En Linux usamos% ju, pero no parece haber ningún equivalente en Solaris. Lo más cercano que puedo encontrar es% lu, pero esto produce un resultado incorrecto. Algún 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 preguntar), es " 28 "
¿Qué puedo usar?
Solución
Si tiene inttypes.h disponible, puede usar las macros que proporciona:
printf( "%" PRIu64 "\n", val);
No es bonito (parece que lo digo mucho recientemente), pero funciona.
Otros consejos
En un sistema compatible con C99:
#include <inttypes.h>
uint64_t big = ...;
printf("%" PRIu64 "\n", big);
Consulte la sección 7.8 del estándar C99.
Los especificadores son {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}
Donde PRI es para la familia printf (), SCN es para la familia scanf (), d y i para tipos integrales firmados; o, u, x, X son para tipos integrales sin signo como octal, decimal, hex y hex; N es uno de los anchos soportados; MENOS y RÁPIDOS corresponden a esos modificadores; PTR es para intptr_t; y MAX es para intmax_t.
La respuesta depende de si su código es en realidad C o C ++. En C, debería usar un sin signo largo largo
en lugar de otro tipo (esto es conforme al estándar actual, y largo largo
es bastante común en lo que respecta al soporte de C99) ), agregando ULL
en lugar de L
a su constante, y usando (como se ha mencionado) % llu
como su especificador. Si el soporte para C99 no existe, es posible que desee consultar la documentación del compilador, ya que no hay otra forma estándar de hacerlo. long long
está garantizado para ser de 64 bits como mínimo.
Puedes 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. :-)
Puede obtener uint64_t
de stdint.h
si desea evitar el typedef condicional de SunOS.