Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: t4r0x en 15 Abril 2014, 08:06 am



Título: Problema con strtol
Publicado por: t4r0x en 15 Abril 2014, 08:06 am
Hola queria saber si alguien sabe porque el valor devuelto por strtol es incorrecto:

string test = "0xC0000040";
unsigned long TDword = strtol(test.c_str(),0,0);

El valor devuelto es 0x7FFFFFFF y no 0xC0000040.


Título: Re: Problema con strtol
Publicado por: x64core en 15 Abril 2014, 09:00 am
Hola queria saber si alguien sabe porque el valor devuelto por strtol es incorrecto:

string test = "0xC0000040";
unsigned long TDword = strtol(test.c_str(),0,0);

El valor devuelto es 0x7FFFFFFF y no 0xC0000040.

strtol para valores con signo, usa strtoul.


Título: Re: Problema con strtol
Publicado por: eferion en 15 Abril 2014, 09:01 am
* A la hora de escribir código, usa las etiquetas GeSHi, gracias *

Citar
If the value read is out of the range of representable values by a long int, the function returns LONG_MAX or LONG_MIN (defined in <climits>), and errno is set to ERANGE.

Dicho en cristiano... si el valor a traducir está fuera de rango, la función devolverá LONG_MAX o LONG_MIN dependiendo de si te has pasado por arriba o por abajo.

En tu caso el valor devuelto es LONG_MAX.

El por qué es sencillo. Long son 32 bits, reservando uno para el signo. El bit de signo es el primero empezando por la izquierda. Si convertimos tu cifra a binario queda:

Código:
   C    0    0    0     0    0    4    0
1100 0000 0000 0000 00000 0000 1000 0000

El primer bit por la izquierda es uno, es decir, estaría representando a un número negativo... dado que el valor lo has dado en hexadecimal, representando un número positivo, no es posible realizar la conversión... convertir un número positivo en uno negativo no suele quedar bien.

Dado que el número en hexadecimal es positivo, la función te devuelve LONG_MAX.

Si cambias esa C por, como mucho, un 7, la función te devolverá el valor esperado.