elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con strtol
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con strtol  (Leído 1,863 veces)
t4r0x

Desconectado Desconectado

Mensajes: 92



Ver Perfil
Problema con strtol
« 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.


« Última modificación: 15 Abril 2014, 08:11 am por t4r0x » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Problema con strtol
« Respuesta #1 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.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con strtol
« Respuesta #2 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.

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,651 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
Porque no puedo pasarle la direccion de la cadena? strtol
Programación C/C++
7emiliosk8 9 4,083 Último mensaje 12 Febrero 2017, 02:55 am
por 7emiliosk8
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines