Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: josri en 28 Junio 2013, 06:45 am



Título: Rango de variables???
Publicado por: josri 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.


Título: Re: Rango de variables???
Publicado por: flony 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


Título: Re: Rango de variables???
Publicado por: eferion 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.


Título: Re: Rango de variables???
Publicado por: engel lex 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?


Título: Re: Rango de variables???
Publicado por: amchacon 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).


Título: Re: Rango de variables???
Publicado por: pacoperico 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.


Título: Re: Rango de variables???
Publicado por: OmarHack 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!


Título: Re: Rango de variables???
Publicado por: josri 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.


Título: Re: Rango de variables???
Publicado por: josri en 28 Junio 2013, 19:43 pm
Para double imagino es el mismo caso, no? claro cambiando ahora el rango soportado.


Título: Re: Rango de variables???
Publicado por: rir3760 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 (https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules).

Un saludo