c - Wie formatiere ich ein unsigned long long int mit printf?

Translate
#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 stammtunsigned long long int. Wie geht es dir?printf()einunsigned long long int?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Verwenden Sie den Long-Long-Modifikator ll (el-el) mit der u-Konvertierung (ohne Vorzeichen). (Funktioniert in Windows, GNU).

printf("%llu", 285212672);
Quelle
Translate

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

uint64_t x;
uint32_t y;

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

Dies ist "garantiert", um Ihnen nicht die gleichen Probleme zu bereiten wielong, unsigned long longusw., da Sie nicht erraten müssen, wie viele Bits in jedem Datentyp enthalten sind.

Quelle
Translate

%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

Quelle
Bruno Lee
Translate

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

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

Dies liegt daran, dass% llu unter Windows nicht ordnungsgemäß funktioniert und% d 64-Bit-Ganzzahlen nicht verarbeiten kann. Ich schlage vor, stattdessen PRIu64 zu verwenden, 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.
Quelle
Translate

Unter Linux ist es so%lluund in Windows ist es%I64u

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

Quelle
Translate

Kompilieren Sie es als x64 mit VS2005:

% llu funktioniert gut.

Quelle
Translate

Nicht standardmäßige Dinge sind immer seltsam :)

für den langen langen Teil unter GNU ist esL, lloderq

und unter Fenstern glaube ich es istllnur

Quelle
Translate

Verhexen:

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

Ausgabe:

64bit: FFFFFFFFFFFFFFFF
Quelle
Translate

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

  • Möglicherweise wird dieser Fehler bei gcc / mingw angezeigt:

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
Translate

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

Dies 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 korrekten __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.

Quelle
Translate

Anscheinend hat sich niemand eine plattformübergreifende * Lösung ausgedachtüber ein Jahrzehntseit dem Jahr 2008, also werde ich meine anhängen? Bitte stimmen Sie zu. (Scherz. 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));

OPs Beispiel:

#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%lldDruckformat Zeichenfolge, diese funktioniert für michunter 32-Bit-GCC unter Windows.

*) Gut,fastMulti-Plattform. In MSVC brauchen Sie anscheinend_ui64toa()Anstatt vonlltoa().

Quelle