#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 gehe davon aus, dass dieses unerwartete Ergebnis vom Drucken der stammt unsigned long long int
. Wie wollen Sie printf()
Benutzer unsigned long long int
?
Antworten:
Verwenden Sie den Long-Long-Modifikator ll (el-el) mit der u-Konvertierung (ohne Vorzeichen). (Funktioniert in Windows, GNU).
quelle
long long
Argumente an eines von ihnen übergebenprintf
und das falsche Format für eines von ihnen verwenden, beispielsweise%d
anstelle von%lld
, selbst die Argumente, die nach dem falschen gedruckt werden, möglicherweise vollständig deaktiviert sind (oder sogarprintf
zum Absturz führen können ). Im Wesentlichen werden variable Argumente ohne Typinformationen an printf übergeben. Wenn also die Formatzeichenfolge falsch ist, ist das Ergebnis unvorhersehbar.Möglicherweise möchten Sie mit der inttypes.h Bibliothek , um zu versuchen , die Sie Typen wie gibt
int32_t
,int64_t
,uint64_t
etc. Sie können dann ihre Makros verwenden wie zum Beispiel:Dies wird als „garantiert“ nicht geben Ihnen die gleichen Probleme wie
long
,unsigned long long
etc, da Sie nicht erraten, wie viele Bits in jedem Datentyp sind.quelle
PRId64
,PRId32
definiert Makros?inttypes.h
PRIu64
undPRIu32
für vorzeichenlose ganze Zahlen.inttypes.h
Standard? Wäre es nicht sostdint.h
?leastX
undfastX
(die tatsächlich breiter als angegeben sein können) sind obligatorisch.%d
-> fürint
%u
-> fürunsigned int
%ld
-> fürlong int
oderlong
%lu
-> fürunsigned long int
oderlong unsigned int
oderunsigned long
%lld
-> fürlong long int
oderlong long
%llu
-> fürunsigned long long int
oderunsigned long long
quelle
Für lange lange (oder __int64) mit MSVS sollten Sie% I64d verwenden:
quelle
Dies liegt daran, dass% llu unter Windows nicht ordnungsgemäß funktioniert und% d keine 64-Bit-Ganzzahlen verarbeiten kann. Ich schlage vor, stattdessen PRIu64 zu verwenden, und Sie werden feststellen, dass es auch auf Linux portierbar ist.
Versuchen Sie stattdessen Folgendes:
Ausgabe
quelle
int64_t
stattdessen, da es möglicherweise einige Implementierungen gibt, bei denen long long größer als long istUnter Linux ist es
%llu
und unter Windows ist es%I64u
Obwohl ich festgestellt habe, dass es in Windows 2000 nicht funktioniert, scheint es dort einen Fehler zu geben!
quelle
unsigned long long
Datentyp (zu der Zeit mit dem C99-Standard) relativ neu ist, C-Compiler (einschließlich MinGW / GCC) jedoch die alte Microsoft C-Laufzeit verwenden, die nur die C89-Spezifikation unterstützt. Ich habe nur Zugriff auf wirklich alte und relativ aktuelle Windows-API-Dokumente. Es ist daher schwierig, genau zu sagen, wann derI64u
Support eingestellt wurde. Aber es klingt wie in der XP-Ära.Kompilieren Sie es als x64 mit VS2005:
quelle
Zusätzlich zu dem, was die Leute vor Jahren geschrieben haben:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Dann ist Ihre Version von mingw nicht standardmäßig c99. Fügen Sie dieses Compiler-Flag hinzu :
-std=c99
.quelle
Anscheinend hat sich seit über einem Jahrzehnt niemand eine Multi-Plattform * -Lösung ausgedacht seit [dem] Jahr 2008 seit ausgedacht, also werde ich meine anhängen 😛. Bitte stimmen Sie zu. (Scherz. Es ist mir egal.)
Lösung:
lltoa()
Wie benutzt man:
OPs Beispiel:
Im Gegensatz zur
%lld
Druckformatzeichenfolge funktioniert diese für mich unter 32-Bit-GCC unter Windows.*) Nun, fast plattformübergreifend. In MSVC brauchen Sie anscheinend
_ui64toa()
stattlltoa()
.quelle
lltoa
.Nicht standardmäßige Dinge sind immer seltsam :)
für den langen langen Teil unter GNU ist es
L
,ll
oderq
und unter Fenstern glaube ich, dass es
ll
nur istquelle
Verhexen:
Ausgabe:
quelle
Eine Möglichkeit besteht darin, es mit VS2008 als x64 zu kompilieren
Dies läuft wie erwartet:
Für 32-Bit-Code müssen wir den korrekten __int64-Formatbezeichner% I64u verwenden. So wird es.
Dieser Code funktioniert sowohl für 32- als auch für 64-Bit-VS-Compiler.
quelle