Frage

#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 auf das Drucken zurückzuführen ist unsigned long long int.Wie geht es dir? printf() ein unsigned long long int?

War es hilfreich?

Lösung

Verwenden Sie den Modifikator ll (el-el) long-long mit der Konvertierung u (unsigned).(Funktioniert unter Windows, GNU).

printf("%llu", 285212672);

Andere Tipps

Möglicherweise möchten Sie versuchen, die Bibliothek inttypes.h zu verwenden, die Ihnen Typen wie zint32_t, int64_t, uint64_t usw.Sie können dann seine Makros verwenden, wie zum Beispiel:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

Dies wird Ihnen „garantiert“ nicht die gleichen Probleme bereiten wie long, unsigned long long usw., da Sie nicht raten müssen, wie viele Bits in jedem Datentyp enthalten sind.

%d--> für int

%u--> für unsigned int

%ld--> für long int

%lu--> für unsigned long int

%lld--> für long long int

%llu--> für unsigned long long int

Für long long (oder __int64) mit MSVS sollten Sie %I64d verwenden:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

Das liegt daran, dass %llu unter Windows nicht richtig funktioniert und %d keine 64-Bit-Ganzzahlen verarbeiten kann.Ich empfehle stattdessen die Verwendung von PRIu64 und Sie werden feststellen, dass es auch auf Linux portierbar ist.

Versuchen Sie stattdessen Folgendes:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Ausgabe

My number is 8 bytes wide and its value is 285212672. A normal number is 5.

Unter Linux ist es so %llu und in Windows ist es so %I64u

Obwohl ich festgestellt habe, dass es unter Windows 2000 nicht funktioniert, scheint es dort einen Fehler zu geben!

Kompilieren Sie es als x64 mit VS2005:

%llu funktioniert gut.

Ungewöhnliche Dinge sind immer seltsam :)

Für den langen Teil unter GNU ist es L, ll oder q

und unter Windows glaube ich, dass es so ist ll nur

Verhexen:

printf("64bit: %llp", 0xffffffffffffffff);

Ausgabe:

64bit: FFFFFFFFFFFFFFFF

Zusätzlich zu dem, was die Leute vor Jahren geschrieben haben:

  • Möglicherweise erhalten Sie diesen Fehler auf gcc/mingw:

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 auf c99 eingestellt.Fügen Sie dieses Compiler-Flag hinzu: -std=c99.

Nun, eine Möglichkeit besteht darin, es mit VS2008 als x64 zu kompilieren

Das läuft wie erwartet:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

Für 32-Bit-Code müssen wir den richtigen __int64-Formatbezeichner %I64u verwenden.So wird es.

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

Dieser Code funktioniert sowohl für 32- als auch für 64-Bit-VS-Compiler.

Anscheinend hat niemand eine Multiplattform*-Lösung dafür gefunden über ein Jahrzehnt seit [dem] Jahr 2008, also werde ich meine anhängen 😛.Bitte stimmen Sie zu.(Scherzen.Es ist mir egal.)

Lösung: lltoa()

Wie benutzt man:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

Beispiel von OP:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

im Gegensatz zu den %lld Druckformatzeichenfolge, diese funktioniert für mich unter 32-Bit-GCC unter Windows.

*) Also, fast Multiplattform.In MSVC brauchen Sie anscheinend _ui64toa() anstatt lltoa().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top