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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top