printf + uint_64 auf Solaris 9?
Frage
Ich habe einige c (++) Code, sprintf eine uint_64 in eine Zeichenfolge zu konvertieren verwendet. Dies muss sowohl auf Linux tragbar sein und Solaris.
Unter Linux verwenden wir% ju, aber es scheint, keine Entsprechung auf Solaris zu sein. Die nächstgelegene ich finden kann, ist% lu, aber dies erzeugt fehlerhafte Ausgabe. Einige Beispielcode:
#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
}
Unter Linux wird die Ausgabe wie erwartet; auf Solaris 9 (nicht fragen), dann ist es "28"
Was kann ich verwenden?
Lösung
Wenn Sie haben inttypes.h verfügbar Sie die Makros verwenden können, es bietet:
printf( "%" PRIu64 "\n", val);
Nicht schön (ich scheinen zu sagen, dass eine Menge vor kurzem), aber es funktioniert.
Andere Tipps
Auf einem C99-konformes System:
#include <inttypes.h>
uint64_t big = ...;
printf("%" PRIu64 "\n", big);
Abschnitt 7.8 des C99-Standard alle Rechte vorbehalten.
Die Bezeich sind {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}
Wo PRI für die printf () Familie, SCN ist für die scanf () Familie, d und i für signierte ganzzahlige Typen; o, u, x, X für unsigned integralen Typen als oktale, dezimale, hex, und Hex; N ist eine der unterstützten Breiten; Wenigsten und FAST entsprechen die Modifikatoren; PTR ist für intptr_t; und MAX ist für intmax_t.
Die Antwort hängt davon ab, ob Ihr Code ist eigentlich C oder C ++. In C, sollten Sie eine unsigned long long
eher als eine andere Art verwendet werden (dies den aktuellen Standard konformen ist, und long long
ist sehr verbreitet bis C99 Unterstützung geht), Anfügen ULL
statt L
auf Ihre Konstante und Verwendung (wie schon erwähnt) %llu
als Bezeichner. Wenn die Unterstützung für C99 nicht vorhanden ist, können Sie die Compiler-Dokumentation zu überprüfen, da es kein anderer Standard-Weg, es zu tun. long long
ist guarateed 64 Bits zumindest sein.
Sie können mit %llu
für lange lange. Dies ist jedoch nicht sehr portabel entweder, weil long long
nicht als 64-Bit gewährleistet ist. : -)
Sie können uint64_t
von stdint.h
, wenn Sie die SunOS bedingte typedef vermeiden wollen.