Domanda
Ho del codice c (++) che usa sprintf per convertire un uint_64 in una stringa. Questo deve essere portatile sia per Linux che per Solaris.
Su Linux usiamo% ju, ma non sembra esserci alcun equivalente su Solaris. Il più vicino che riesco a trovare è% lu, ma questo produce un output errato. Alcuni esempi di codice:
#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
}
Su Linux, l'output è come previsto; su Solaris 9 (non chiedere), è " 28 "
Cosa posso usare?
Soluzione
Se hai inttypes.h disponibile puoi usare le macro che fornisce:
printf( "%" PRIu64 "\n", val);
Non carino (sembra che lo dica molto di recente), ma funziona.
Altri suggerimenti
Su un sistema conforme a C99:
#include <inttypes.h>
uint64_t big = ...;
printf("%" PRIu64 "\n", big);
Vedi sezione 7.8 dello standard C99.
Gli specificatori sono {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}
Dove PRI è per la famiglia printf (), SCN è per la famiglia scanf (), d e i per i tipi integrali firmati; o, u, x, X sono per tipi integrali senza segno come ottale, decimale, esadecimale e esadecimale; N è una delle larghezze supportate; LEAST e FAST corrispondono a quei modificatori; PTR è per intptr_t; e MAX è per intmax_t.
La risposta dipende dal fatto che il tuo codice sia effettivamente C o C ++. In C, dovresti usare un unsigned long long
piuttosto che un altro tipo (questo è conforme allo standard attuale e long long
è abbastanza comune per quanto riguarda il supporto C99 ), aggiungendo ULL
anziché L
alla tua costante e utilizzando (come è stato menzionato) % llu
come identificatore. Se il supporto per C99 non esiste, è possibile controllare la documentazione del compilatore, poiché non esiste un altro modo standard per farlo. long long
è garantito almeno 64 bit.
Puoi usare % llu
per molto tempo. Tuttavia, anche questo non è molto portatile, perché long long
non è garantito per essere 64 bit. : -)
Puoi ottenere uint64_t
da stdint.h
se vuoi evitare il typedef condizionale di SunOS.