strtoull und lange lange arithmetische
-
22-07-2019 - |
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
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