Tengo este tonto programa de ejemplo que toma un valor de entrada como hexadecimal y lo convierte en un entero largo sin signo. Después de la conversión imprimo el resultado.
#include <stdio.h> int main (int argc, char *argv[]) { unsigned long int id = 0; id = strtoul(argv[1], NULL, 16); printf("value: %lx\n", id); return 0; }el problema es que ejecutar este programa con un número hexadecimal superior a 31 bits hace que el valor de salida sea completamente incorrecto. Los 32 bits superiores se convierten todos en (0xf). ¿No debería strtoul() ser capaz de manejar números hasta 2^64? ¿Por qué los bits >32 son basura? La máquina es una X86_64 y, de hecho, el resultado también es el mismo con strtoull().
$ ./ex 0x7fffffff value: 7fffffff $ ./ex 0x80000000 value: ffffffff80000000 $ ./ex 0x3cf180000000 value: ffffffff80000000Su solución funciona correctamente para mí en mi máquina local. Sin embargo, creo que debe incluir:
#include <stdlib.h>Strtoul es parte de stdlib.