2008-10-03 14 views
9

Ich habe einige c (++) Code, der sprintf verwendet, um eine Uint_64 in eine Zeichenfolge zu konvertieren. Dies muss sowohl auf Linux als auch auf Solaris portierbar sein.printf + uint_64 auf Solaris 9?

Unter Linux verwenden wir% ju, aber unter Solaris scheint es keine Entsprechung zu geben. Der nächste, den ich finden kann, ist% lu, aber dies erzeugt eine falsche Ausgabe. Ein 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 ist die Ausgabe wie erwartet; auf Solaris 9 (nicht fragen), es ist "28"

Was kann ich verwenden?

Antwort

11

Wenn Sie zur Verfügung haben inttypes.h haben, können Sie die Makros verwenden, es bietet:

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

Nicht schön (ich scheine viel vor kurzem zu sagen, dass), aber es funktioniert.

+0

Awesome! Das hat perfekt funktioniert. Vielen Dank! –

0

Sie können %llu lange verwenden. Dies ist jedoch auch nicht sehr portabel, da long long nicht garantiert ist, 64 Bit zu sein. :-)

0

Sie können uint64_t von stdint.h erhalten, wenn Sie den SunOS-bedingten Typdef vermeiden möchten.

+0

Aber Sie müssen auch PRIu64 von , und das schließt . –

+0

Guter Punkt, dank Jonathan :) –

2

Die Antwort hängt davon ab, ob Ihr Code tatsächlich C oder C++ ist. In C sollten Sie einen unsigned long long anstelle eines anderen Typs verwenden (dies entspricht dem aktuellen Standard, und long long ist ziemlich weit verbreitet, so weit C99 unterstützt), indem Sie ULL anstelle von L an Ihre Konstante anhängen und (wie es war erwähnt) %llu als Ihr Spezifizierer. Wenn die Unterstützung für C99 nicht vorhanden ist, sollten Sie die Compilerdokumentation überprüfen, da es keine andere Standardmethode gibt. long long ist garantiert mindestens 64 Bit.

+2

uint64_t ist genauso Standard wie unsigned long long. –

7

Auf einem C99-konformes System:

#include <inttypes.h> 

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

Siehe Abschnitt 7.8 des C99-Standard.

Spezifizierer sind {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}

Wo PRI für die printf() Familie ist, SCN für die scanf() Familie ist, d und ich für vorzeichenbehaftete ganzzahlige Typen; o, u, x, X sind für vorzeichenlose ganzzahlige Typen wie oktal, dezimal, hex und hex; N ist eine der unterstützten Breiten; LEAST und FAST entsprechen diesen Modifikatoren; PTR ist für intptr_t; und MAX ist für intmax_t.