Frage

Kann jemand die Ausgabe dieses Programms erklären und wie kann ich es beheben?

unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);

// 18446744073490980372
War es hilfreich?

Lösung

Sie haben <stdlib.h> enthalten?

ich auf MacOS X reproduzieren kann, wenn ich <stdlib.h> weglassen.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned long long ns = strtoll("123110724001300", (char **)NULL, 10);
    printf("%llu\n", ns);
    return(0);
}

Lassen Sie den Header, erhalte ich Ihr Ergebnis. Fügen Sie den Header, erhalte ich die richtige Antwort.

32-Bit- und 64-Bit kompiliert.


Wie in den Kommentaren erwähnt, in Ermangelung einer Erklärung für strtoll (), der Compiler behandelt sie als eine Funktion der Rückkehr int.

Um mehr zu sehen, was geht, Blick auf die Hex-Ausgänge:

     123110724001300    0x00006FF7_F2F8DE14    Correct
18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect

manuell eingefügt Unterstrichen ...

Andere Tipps

Warum strtoull nicht verwenden, wenn Sie ein unsigned long long wollen?

Ich kann nicht das Verhalten erklären. Jedoch auf 32-Bit-Windows XP mit Cygwin gcc-4.3.2:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    unsigned long long ns = strtoull("123110724001300", NULL, 10);
    fprintf(stderr, "%llu\n", ns);
    return 0;
}

druckt

E:\Home> t.exe
123110724001300
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top