Wie kann man format unsigned long long int verwenden von printf?
#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Ausgabe:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Ich nehme dieses unerwartete Ergebnis ist aus-Druck der unsigned long long int
. Wie wollen Sie printf()
eine unsigned long long int
?
- Ich habe gerade kompiliert dein code ( mit %anzeiiri ) mit gcc und der Ausgang war der richtige. Sind Sie auf der übergabe von Optionen an den compiler?
- Beachten Sie, dass samsung bada ist newlib scheint nicht zu unterstützen, "%lld" : "developer.bada.com/forum/...
- Siehe auch stackoverflow.com/questions/5140871/sprintf-for-unsigned-int64
- Ich würde vorschlagen, mit Verwendung von stdint.h und explizit über die Anzahl von bits in eine variable. Wir sind immer noch in einer Phase des übergangs zwischen 32 und 64 bit-Architekturen, und "unsigned long long int" bedeutet nicht das gleiche auf beiden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die ll (el-el) lang-lang-Modifizierer, die mit u (unsigned) Datentyp-Konvertierung. (Funktioniert in windows, GNU).
long long
Argumente zuprintf
und nutzen Sie die Falsches format für eine von Ihnen, sagen%d
statt%lld
dann auch noch die Argumente, die ausgegeben wird nachdem die falsche kann man komplett ausschalten (oder kann sogar dazu führen, dassprintf
zum Absturz). Im wesentlichen, variable Argumente an printf, ohne jede Art von Informationen, so dass, wenn der format-string ist falsch, das Ergebnis ist unvorhersehbar.Möchten Sie vielleicht zu versuchen, mit der inttypes.h-Bibliothek, die Ihnen Typen wie
int32_t
,int64_t
,uint64_t
etc.Dann können Sie Ihre Makros wie:
Ist dies "garantiert" nicht geben Sie die gleichen Schwierigkeiten wie
long
,unsigned long long
etc, da Sie nicht haben, zu erraten, wie viele bits sind in jedem Datentyp.PRId64
,PRId32
Makros definiert?inttypes.h
PRIu64
undPRIu32
für unsigned Integer.inttypes.h
standard? Wäre es nichtstdint.h
?leastX
undfastX
Typen (die durchaus breiter sein als angegeben) sind obligatorisch.%d
--> fürint
%u
--> fürunsigned int
%ld
--> fürlong int
%lu
--> fürunsigned long int
%lld
--> fürlong long int
%llu
--> fürunsigned long long int
Für lange (oder __int64) mit MSVS, die Sie verwenden sollten, %I64d an:
Ist da %anzeiiri funktioniert nicht richtig unter Windows und %d kann nicht mit 64-bit-Ganzzahlen. Ich schlage vor, mit PRIu64 statt und Sie werden feststellen, es ist portabel zu Linux.
Versuchen Sie dies:
Ausgabe
int64_t
statt, da kann es gut sein, einige Implementierungen mit langen größer, als langeIn Linux ist es
%llu
und in Windows ist es%I64u
Obwohl ich gefunden habe, es funktioniert nicht in Windows 2000, es scheint ein Fehler zu sein dort!
unsigned long long
datatype relativ neue (zu der Zeit, mit dem C99-standard), aber C-Compiler (inklusive MinGW/GCC) mit dem alten Microsoft-C-runtime, die nur unterstützt die C89 spec. Ich habe nur Zugriff auf wirklich alten und halbwegs aktuellen Windows-API-docs. So ist es schwierig zu sagen, Wann genauI64u
- support wurde fallen gelassen. Aber es klingt wie die XP-ära.Kompilieren Sie es als x64 mit VS2005:
Nicht-standard-Dinge sind immer komisch 🙂
für das lange Teil
unter GNU es
L
,ll
oderq
und unter windows glaube ich, dass es
ll
nurHex:
Ausgabe:
Zusätzlich zu dem, was die Menschen schrieb vor Jahren:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Dann Ihre version von mingw standardmäßig nicht c99. Fügen Sie diese compiler-flag:
-std=c99
.Nun, ein Weg ist, um es zu kompilieren als x64 mit VS2008
Läuft wie man es erwarten würde:
Für 32-bit-code, die wir brauchen, um die richtige __int64 Formatbezeichner " %I64u. So wird es.
Dieser code funktioniert sowohl für 32-und 64-bit-VS-compiler.
Anscheinend hat niemand kommen mit einem multi-Plattform-Lösung für über einem Jahrzehnt seit [dem] Jahr 2008, also muss ich anfügen, mir ?. Plz upvote. (War nur ein Scherz. I don ' T care.)
Lösung:
lltoa()
Wie zu verwenden:
OP ' s Beispiel:
Im Gegensatz zu den
%lld
print format-Zeichenfolge, diese funktioniert bei mir unter 32-bit-GCC auf Windows.*) Naja, fast multi-Plattform. In MSVC, offenbar müssen
_ui64toa()
stattlltoa()
.