aritmetica lunga e lunga
-
22-07-2019 - |
Domanda
Qualcuno può spiegare l'output di questo programma e come posso ripararlo?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
Soluzione
Hai <stdlib.h>
incluso?
Posso riprodurre su MacOS X se ometto <=>.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned long long ns = strtoll("123110724001300", (char **)NULL, 10);
printf("%llu\n", ns);
return(0);
}
Ometti l'intestazione, ottengo il tuo risultato. Includi l'intestazione, ottengo la risposta corretta.
Compilazioni a 32 e 64 bit.
Come notato nei commenti, in assenza di una dichiarazione per strtoll (), il compilatore lo considera come una funzione che restituisce int.
Per vedere di più su ciò che accade, guarda le uscite esadecimali:
123110724001300 0x00006FF7_F2F8DE14 Correct
18446744073490980372 0xFFFFFFFF_F2F8DE14 Incorrect
I caratteri di sottolineatura inseriti manualmente ...
Altri suggerimenti
Perché non usare strtoull se vuoi un unsigned long long?
Non riesco a spiegare il comportamento. Tuttavia, su Windows XP a 32 bit con 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;
}
stampe
E:\Home> t.exe 123110724001300