Problema con strtol

Iniciado por t4r0x, 15 Abril 2014, 08:06 AM

0 Miembros y 1 Visitante están viendo este tema.

t4r0x

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.

x64core

Cita de: 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.

strtol para valores con signo, usa strtoul.

eferion

* A la hora de escribir código, usa las etiquetas GeSHi, gracias *

CitarIf 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    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.