strtoull et longue longue arithmétique
-
22-07-2019 - |
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
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