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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top