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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top