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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


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

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Rango de variables???
« en: 28 Junio 2013, 06:45 am »

Saludos. Pues mi pregunta es la siguiente, se supone que tengo que verificar que una variable declarada (en C) como int o como double se use de forma adecuada es decir que no sobrepase su rango, tengo mas o menos entendido que su rango es un cierto valor numerico pero no creo que la definicion que tengo sea la correcta.

El caso es que una vez declaradas dos variables int (por ejemplo), como podria hacer una operacion que supere su rango??.

No quiero codigos fuentes ni nada, solo que no entiendo esa parte de ejemplificar alguna operacion que supere el rango de un int o double, para que asi con otro programa que lee este codigo fuente marque el error en la operacion e indique que sobrpaso el rango.

Espero haberme explicado bien jajajajja, me hice bolas intentando escribir el problema XD, saludos.


En línea

flony


Desconectado Desconectado

Mensajes: 583



Ver Perfil
Re: Rango de variables???
« Respuesta #1 en: 28 Junio 2013, 07:24 am »

de int
Citar
signed: -2147483648 to 2147483647
unsigned: 0 to 4294967295
supongo q si sumas uno pasa el rango


En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Rango de variables???
« Respuesta #2 en: 28 Junio 2013, 09:16 am »

Lo primero es tener las cosas claras... y para ello nada mejor que empezar con un poco de aburrida teoría:

El rango de una variable viene definido únicamente por el número de bits destinados a almacenar valores.

En el caso de 8 bits, por ejemplo:
* [0 255] para valores sin signo
* [-128 127] para valores con signo.

Es decir, cualquier combinación de unos y ceros que se te ocurra poner en esos 8 bits va a resultar en un valor válido para esa variable.

Dicho esto hay dos escenarios:

1. Tienes que validar si al realizar una operación matemática el resultado se pasa de rango.

En este caso debes buscar incoherencias.

Ejemplo: 8 bits sin signo: 255 + 1 te dará 0, que es menor a 255

2. Tienes que validar que si un valor se puede almacenar en una variable dada.

En este caso vas a disponer de un string y te piden saber si ese valor convertido a número entra en la variable.

Tienes varias posibilidades, aunque quizás la más sencilla, si solo tienes que decir si la variable entra o no sea hacer una conversión string -> número -> string y comparar los dos strings a ver si son iguales ( si la variable no entra lo strings serán diferentes ).

Y poco más que decir, con esto creo que debería valerte.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Rango de variables???
« Respuesta #3 en: 28 Junio 2013, 09:24 am »

Ejemplo: 8 bits sin signo: 255 + 1 te dará 0, que es menor a 255

si la variable desborda no debería hacer o un run-time error o una corrupción del código por desbordamiento?
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Rango de variables???
« Respuesta #4 en: 28 Junio 2013, 10:59 am »

si la variable desborda no debería hacer o un run-time error o una corrupción del código por desbordamiento?
Te estás confundiendo con los vectores, aquí no se accede a otras posiciones de la memoria.

Prueba este código:

Código
  1. #include<iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    short Numero = 0;
  8.  
  9.    while (1)
  10.    {
  11.        Numero++;
  12.        cout<<Numero<<endl;
  13.        Sleep(1);
  14.    }
  15.    return 0;
  16. }

Fijate que cuando llega a 32250 (el máximo rango), pasa de repente a los números negativos. Si pruebas con un unsigned pasará directamente a 0 (cuando llege a 65000).
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
pacoperico

Desconectado Desconectado

Mensajes: 100


Ver Perfil
Re: Rango de variables???
« Respuesta #5 en: 28 Junio 2013, 15:41 pm »

Y para comprobar si el valor de una variable se ha salido de rango tienes otra alternativa, en el archivo limits.h hay definidas una seria de constantes macro que representan los valores maximos y minimos que pueden tener los distintos tipos de datos como:

Código
  1. #include <limits.h>
  2. INT_MAX  //representa el valor maximo que puede tener un int
  3. INT_MIN  //valor minimo de un int
  4. USHRT_MAX  //valor maximo de un unsigned short
  5. //etc

Las puedes usar para comprobar si una operacion se sale de rango.
En línea

OmarHack


Desconectado Desconectado

Mensajes: 1.268


Ver Perfil
Re: Rango de variables???
« Respuesta #6 en: 28 Junio 2013, 17:25 pm »

Yo lo haría de otra manera, se que no quieres códigos pero te lo pondré para que lo entiendas, es más fácil de explicar.

Código
  1. #include <iostream>
  2. using namespace std;
  3. int a;
  4. int b;
  5. signed short  numeroDadoPorElUsuario;
  6. signed short numeroDosDadoPorElUsuario;
  7. signed short resultado;
  8. unsigned long resultadoReal;
  9.  
  10. int main()
  11. {
  12. cout << "pon tu numero: ";
  13. cin >> a;
  14. numeroDadoPorElUsuario = a;
  15.  
  16.  
  17. cout << endl << "pon el segundo numero: ";
  18. cin >> b;
  19.  
  20. numeroDosDadoPorElUsuario = b;
  21.  
  22.  
  23.  
  24. resultado = numeroDadoPorElUsuario * numeroDosDadoPorElUsuario;
  25. resultadoReal = numeroDadoPorElUsuario * numeroDosDadoPorElUsuario;
  26.  
  27. cout << "El resultado del programa es: " << resultado << endl;
  28. cout << "El resultado de la operacion es: " << resultadoReal << endl;
  29.  
  30. if (resultado != resultadoReal)
  31. {
  32. cout <<"La operación introducida ha superado el rango de signed short";
  33.              }
  34.  
  35. getchar();
  36. getchar();
  37.  
  38. return 0;
  39. }

Te lo he puesto en C++ que me es mucho más fácil, compílalo y multiplica 9999 por 9, podrás comprobar que te da el valor que coge en un signed short, pero que da la vuelta al pasarse de rango. También te da el valor de un long que en ese caso sería el valor real, dependiendo del caso habría que modificar, o buscar alguna alternativa. Después con un if compruebas si el resultado es el mismo y si no lo es, sabes que el valor del signed short se a pasado. Te comento el código a continuación.

Incluimos la librería de entrada y salida.
Declaramos que usaremos el cin y el cout que se encuentra en el namespace std. Es solo para que el compilador encuentre cin y cout, que viene siendo scanf y printf simplificados, lo mismo.

Lo que hace básicamente el programa es guardar el resultado en un short y el resultado en un long cada uno en una variable distinta, entonces el número 89991 se pasa del rango de un short pero cabe en un long.

Sencillo, me entendiste no? Un saludo!
En línea

I like to test things.
josri

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Rango de variables???
« Respuesta #7 en: 28 Junio 2013, 19:42 pm »



Gracias a todos por responder, me ha quedado mas claro con los codigos y definiciones que han puesto, bien explicados por cierto, ahora los implementare para ver commo me queda, saludos.
En línea

josri

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Rango de variables???
« Respuesta #8 en: 28 Junio 2013, 19:43 pm »

Para double imagino es el mismo caso, no? claro cambiando ahora el rango soportado.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Rango de variables???
« Respuesta #9 en: 29 Junio 2013, 03:04 am »

se supone que tengo que verificar que una variable declarada (en C) como int o como double se use de forma adecuada es decir que no sobrepase su rango

[...]

El caso es que una vez declaradas dos variables int (por ejemplo), como podria hacer una operacion que supere su rango??.
Solo con las dos variables no es posible. En el caso de los enteros con signo se generaria comportamiento no definido (en buen cristiano: ya nos [CENSORED]) y en el caso de los sin signo el resultado se mueve al rango valido mediante modulo MAX + 1 (MAX es el valor maximo del tipo sin signo en cuestion).

Con ciertos tipos (por ejemplo int) una opcion es utilizar dos variables con un rango de valores mayor. Por ejemplo si la operacion a realizar es con el tipo int utilizarias tres variables auxiliares de tipo long long, dos para almacenar los valores y la tercera para el resultado. Mas o menos asi:
Código
  1. int int_a = ALGUN_VALOR;
  2. int int_b = ALGUN_VALOR;
  3.  
  4. /* ... */
  5.  
  6. long long a = int_a;
  7. long long b = int_b;
  8.  
  9. long long res = a operador b;
Esto con sus limitaciones ya que el rango de valores depende de la implementacion.

no entiendo esa parte de ejemplificar alguna operacion que supere el rango de un int o double, para que asi con otro programa que lee este codigo fuente marque el error en la operacion e indique que sobrpaso el rango.
Si manejas bien el ingles una pagina que describe el tema con algunos ejemplos es INT02-C. Understand integer conversion rules.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pasar variables por formulario sin variables globales¿? « 1 2 »
PHP
hardkoo 11 9,133 Último mensaje 22 Noviembre 2006, 12:55 pm
por chicuela66
Variables dentro de variables (batch)
Scripting
MK-Ultra 8 7,361 Último mensaje 6 Febrero 2008, 23:18 pm
por GUN$
[BATCH] ¿Como puedo meter variables dentro de variables?
Scripting
Meine programmen 1 3,794 Último mensaje 24 Marzo 2012, 16:48 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines