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
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top