Question

Quelqu'un peut-il expliquer le résultat de ce programme et comment je peux le réparer?

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

// 18446744073490980372
Était-ce utile?

La solution

Avez-vous <stdlib.h> inclus?

Je peux reproduire sur MacOS X en omettant <=>.

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

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

Omettez l'en-tête, j'obtiens votre résultat. Incluez l'en-tête, j'obtiens la bonne réponse.

Les compilations 32 bits et 64 bits.

Comme indiqué dans les commentaires, en l'absence d'une déclaration pour strtoll (), le compilateur la traite comme une fonction renvoyant int.

Pour en savoir plus sur ce qui se passe, regardez les sorties hexagonales:

     123110724001300    0x00006FF7_F2F8DE14    Correct
18446744073490980372    0xFFFFFFFF_F2F8DE14    Incorrect

Caractères de soulignement insérés manuellement ...

Autres conseils

Pourquoi ne pas utiliser strtoull si vous voulez un unsigned long long?

Je ne peux pas expliquer le comportement. Cependant, sous Windows XP 32 bits avec 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;
}

imprime

E:\Home> t.exe
123110724001300
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top