Printf %llx
-
Hallo zusammen,
kann mir jemand erklären, warum ich unterschiedliche Ausgaben bekomme?
Auf beiden Systemen arbeite ich mit gcc..
fprintf("# %llu %llu\n",ull, ull);
Windows:
1af44953 7e31d880Sun:
1af4495300000000 7e31d880894a04f8Danke!
-
Anfängerfehler.
%llu ist kein ANSI C Standard, du verwendest aber die Windows-CRT, die dies standardmäßig nicht unterstützt, ebenso wie long long kein ANSI C Standard ist.
-
Ok, dasselbe gilt dann wohl auch für die anderen Darstellungen, llx, llo etc..?
Wie kann ich das umgehen bzw. an stelle dessen verwenden auf einem Windows?
Zufällig %I64x ?
-
Für
__int64
lautet der printf Formatspezifizierer
%I64i (bzw.d,o,x,X)
,
fürunsigned __int64
entsprechend
%I64u (bzw.o,x,X)
.
-
Unter Windows nutze ich cygwin.
Mit %I64x bekomme ich in der Ausgabe I64x I64x ?
-
Mit printf() und i64 hatte ich bisher unter Windows und GCC auch kein Glück und habe deswegen die Werte mit _i64toa in eine Zeichenkette verwandelt. Printf() nimmt anscheindend für alles nur 32bit Pointer und somit immer nur die Lowbytes von 64bit.
Gruß
-
Hast du dafür ein Beispiel?
Kann ich damit etwas hexadezimal ausgeben?
-
cygwin ist kein Windows und benutzt somit auch keine Windows-C-Runtime (CRT).
Demzufolge kommt nur die durch den cygwin-gcc selbstgebaute Bibliothek in Frage, und natürlich, welche Bitbreite sie verwendet.
Probiere mal sizeof(long long), ob hier überhaupt 64 Bit zusammenkommen.
-
Also ein
printf("%llu", sizeof(unsigned long long));
ergibt den etwas suspekten Wert (19-Stellen)
5279154726846332936zu erwarten ist der Wert:
18446744073709551615
-
Wieso sollte ein
long long
denn 16 ExaByte groß sein? Das wäre jenseits der Speicherkapazität jedes bekannten Rechners. sizeof() liefert dir nur einen size_t und deine printf()-Anweisung kombiniert die Größe eines long long (8 Byte) mit zufälligen Speicherinhalten, die zufällig neben dem übergebenen Parameter im RAM standen.
-
Du musst natürlich
printf("%lu", sizeof(unsigned long long));
verwenden.
-
firsttime_on schrieb:
Hast du dafür ein Beispiel?
Kann ich damit etwas hexadezimal ausgeben?falls die Frage an mich gerichtet war, hier die Antwort:
#include <windows.h>
...
long long longwert;
char *longname;
char llbuffer[];
longname = _i64toa(longwert, llbuffer,10);
...letzte 10 für dezimal, es geht auch hex und oct (16 oder 8).
MfG