Rango de variables???

Iniciado por josri, 28 Junio 2013, 06:45 AM

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

josri

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.

flony

de int
Citarsigned: -2147483648 to 2147483647
unsigned: 0 to 4294967295
supongo q si sumas uno pasa el rango
si un problema no tiene solucion entonces no es un problema...es algo inevitable

eferion

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.

engel lex

Cita de: eferion en 28 Junio 2013, 09:16 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?
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

Cita de: engelx en 28 Junio 2013, 09:24 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 (cpp) [Seleccionar]
#include<iostream>
#include <windows.h>
using namespace std;

int main()
{
   short Numero = 0;

   while (1)
   {
       Numero++;
       cout<<Numero<<endl;
       Sleep(1);
   }
   return 0;
}


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

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 (cpp) [Seleccionar]
#include <limits.h>
INT_MAX  //representa el valor maximo que puede tener un int
INT_MIN  //valor minimo de un int
USHRT_MAX  //valor maximo de un unsigned short
//etc


Las puedes usar para comprobar si una operacion se sale de rango.

OmarHack

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 (cpp) [Seleccionar]
#include <iostream>
using namespace std;
int a;
int b;
signed short  numeroDadoPorElUsuario;
signed short numeroDosDadoPorElUsuario;
signed short resultado;
unsigned long resultadoReal;

int main()
{
cout << "pon tu numero: ";
cin >> a;
numeroDadoPorElUsuario = a;


cout << endl << "pon el segundo numero: ";
cin >> b;

numeroDosDadoPorElUsuario = b;



resultado = numeroDadoPorElUsuario * numeroDosDadoPorElUsuario;
resultadoReal = numeroDadoPorElUsuario * numeroDosDadoPorElUsuario;

cout << "El resultado del programa es: " << resultado << endl;
cout << "El resultado de la operacion es: " << resultadoReal << endl;

if (resultado != resultadoReal)
{
cout <<"La operación introducida ha superado el rango de signed short";
              }

getchar();
getchar();

return 0;
}


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!
I like to test things.

josri

Cita de: OmarHack en 28 Junio 2013, 17:25 PM
Yo lo haría de otra ma...
Cita de: pacoperico en 28 Junio 2013, 15:41 PM
Y para comprob...
Cita de: amchacon en 28 Junio 2013, 10:59 AM
Te estás confund...
Cita de: engelx en 28 Junio 2013, 09:24 AM
si la v...
Cita de: eferion en 28 Junio 2013, 09:16 AM
Lo primero es te...
Cita de: flony en 28 Junio 2013, 07:24 AM
de int  sup...


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.

josri

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

rir3760

Cita de: josri en 28 Junio 2013, 06:45 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:
int int_a = ALGUN_VALOR;
int int_b = ALGUN_VALOR;

/* ... */

long long a = int_a;
long long b = int_b;

long long res = a operador b;

Esto con sus limitaciones ya que el rango de valores depende de la implementacion.

Cita de: josri en 28 Junio 2013, 06:45 AMno 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
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