Drucken unsigned long long int-Wert Type Gibt Seltsame Ergebnisse
Ich habe ein problem während benutzen von der printf
Funktion drucken Sie die Werte vom Typ unsigned long long int
Ich habe keine Ahnung, was falsch ist. Ich bin mit Dev-Cpp 4.9.9.2 und Visual Studio 2010 Professional (ich weiß, dass es nicht C-compiler, aber egal, versuchen wollte) auf Windows 7 Professional 64-bit. Für anzeigen, die ich verwendet %llu
modifier (nach Wie Sie von printf () unsigned long long int(format specifier für unsigned long long int)?) aber ich habe auch versucht I64d an, die keine Wirkung...
Erstens, ich wollte nur drucken minimum-und maximum-Wert unsigned long long int
(mit ULONG_MAX
aus limits.h
)
printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
Gibt:
unsigned long long int: 18446744069414584320 zu 1580552164021 (Dev-Cpp)
unsigned long long int: 18446744069414584320 0 (Visual Studio)
Dann habe ich versucht mit printf
drucken zwei Nullen
printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);
Gibt:
unsigned long long int:
0 bis 1580552164021 (Dev-Cpp)unsigned long long int: 0 0 (Visual Studio)
Habe auch versucht zwei ULONG_MAX
Werte
printf("unsigned long long int: \n%llu to %llu \n\n", ULONG_MAX, ULONG_MAX);
Gibt:
unsigned long long int: 18446744073709551615 zu 1580552164021 (Dev-Cpp)
unsigned long long int:
18446744073709551615 0 (Visual Studio)
Warum verhält Sie sich so? Könntest du es mir erklären?
InformationsquelleAutor browning0 | 2012-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist falsch:
Verwenden Sie eine
unsigned long long
Formatbezeichner, aber Sie passieren eineint
und einunsigned long
Wert. Promotion-Regeln bedeuten, dass Sie schlampig für allesint
-Größe oder kleiner, die nicht nicht geltenlong long
.Verwenden wirft:
Erklärung: Beim übergeben von Argumenten an
printf
jede Art passen, die in einerint
wird gefördertint
, und dann jede Art passen, die in einerunsigned int
wird gefördertunsigned int
. Es ist auch okay, pass ein unsigned-Typ, um eine signierte Formatbezeichner oder Umgekehrt, wie lange die Wert übergeben, die dargestellt werden können mit dem angegebenen Typ der Formatbezeichner.So müssen Sie vorsichtig sein, mit
long
undlong long
sein, aber man kann schlampig mitint
,short
, undchar
.Die meisten Compiler Einstellungen haben, um Sie zu warnen, Sie über diese Art von Fehler, da kann es erkannt werden zur compile-Zeit ziemlich leicht; GCC und Clang haben
-Wformat
die Ergebnisse in die folgenden Warnhinweise:Das war schlampig.
InformationsquelleAutor Dietrich Epp
Sind Sie nicht vorbei
unsigned long longs
. Sie übergeben eineint
(0) undunsigned long
(ULONG_MAX). Sie müssen pass zuprintf()
genau das, was Sie Versprechen: im format-string.Versuchen Sie dies:
InformationsquelleAutor Alexey Frunze
ULONG_MAX
bezieht sich aufunsigned long
und nicht zuunsigned long long
. Für letztere verwendenULLONG_MAX
(beachten Sie die zusätzlicheL
).Müssen Sie ändern die
printf()
Anrufe wie:Dadurch wird sichergestellt, dass die Argumente für
printf()
entsprechen die format-Spezifizierer.InformationsquelleAutor NPE
long long int ist ein Typ aus dem C99-standard, die MSVC nicht unterstützt. Nehmen Sie einen compiler C99-Unterstützung (wie z.B. MinGW für Windows) und es wird funktionieren.
long long
trotz Unterstützung nicht C99 voll.InformationsquelleAutor user411313