Question

J'ai un code c (++) qui utilise sprintf pour convertir un uint_64 en chaîne. Cela doit être portable à la fois sous Linux et Solaris.

Sous Linux, nous utilisons% ju, mais il ne semble pas y avoir d’équivalent sous Solaris. Le plus proche que je puisse trouver est% lu, mais cela produit une sortie incorrecte. Quelques exemples de code:

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

Sous Linux, la sortie est comme prévu. sous Solaris 9 (ne demandez pas), il s’agit du "28"

Que puis-je utiliser?

Était-ce utile?

La solution

Si inttypes.h est disponible, vous pouvez utiliser les macros fournies:

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

Ce n’est pas beau (j’ai l’air de dire cela récemment), mais ça marche.

Autres conseils

Sur un système compatible C99:

#include <inttypes.h>

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

Voir la section 7.8 de la norme C99.

Les spécificateurs sont {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}

Où PRI correspond à la famille printf (), SCN à la famille scanf (), d et i aux types intégraux signés; o, u, x, X sont pour les types intégraux non signés tels que octal, décimal, hex et Hex; N est l'une des largeurs supportées; LEAST et FAST correspondent à ces modificateurs; PTR est pour intptr_t; et MAX est pour intmax_t.

La réponse dépend de si votre code est réellement C ou C ++. En C, vous devriez utiliser un unsigned long long plutôt qu'un autre type (conforme à la norme actuelle, et long long est assez commun en ce qui concerne le support de C99 ), en ajoutant ULL au lieu de L à votre constante et en utilisant (comme il a été mentionné) % llu comme spécificateur. Si le support pour C99 n'existe pas, vous pouvez vérifier la documentation du compilateur, car il n'existe pas d'autre moyen standard de le faire. long long est garanti être au moins de 64 bits.

Vous pouvez utiliser % llu pendant longtemps. Cependant, cela n’est pas très portable non plus, car long long n’est pas garanti en 64 bits. : -)

Vous pouvez obtenir uint64_t à partir de stdint.h si vous souhaitez éviter le typedef conditionnel SunOS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top