Strtoull y aritmética larga larga
-
22-07-2019 - |
Pregunta
¿Alguien puede explicar el resultado de este programa y cómo puedo solucionarlo?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
Solución
¿Tiene <stdlib.h>
incluido?
Puedo reproducir en MacOS X si omito <=>.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned long long ns = strtoll("123110724001300", (char **)NULL, 10);
printf("%llu\n", ns);
return(0);
}
Omita el encabezado, obtengo su resultado. Incluya el encabezado, obtengo la respuesta correcta.
Compilaciones de 32 y 64 bits.
Como se señaló en los comentarios, en ausencia de una declaración para strtoll (), el compilador lo trata como una función que devuelve int.
Para ver más de lo que sucede, mira las salidas hexadecimales:
123110724001300 0x00006FF7_F2F8DE14 Correct
18446744073490980372 0xFFFFFFFF_F2F8DE14 Incorrect
Guiones bajos insertados manualmente ...
Otros consejos
¿Por qué no usar strtoull si quieres un largo largo sin firmar?
No puedo explicar el comportamiento. Sin embargo, en Windows XP de 32 bits 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;
}
impresiones
E:\Home> t.exe 123110724001300