Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/02/2015, 16:37
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: duda para sacar factorial de un numero

Si vas a internet y buscas tipos de datos en C encontraras varios lugares que te explican con unas tablillas una especie de "rango" que se permite guardar en cada tipo de datos.

Lo 1º que debes tener claro es que cuando creas una variable, lo que estas haciendo en realidad es reservar un espacio "finito" para guardar datos.

El problema viene que intentas guardar números demasiados "grandes" en un espacio limitado de la memoria.

en esta tabla de aqui: http://2.bp.blogspot.com/_FIPo8hAXPD...2B+enteros.png

...puedes ver claramente que un entero(int) tiene un rango de -2,147,483,648 a 2,147,483,647.

Cuando intentas poner un numero mas grande que 2,147,483,647 veras que que lo que acontece es que te aparece números negativos pero nunca se salen de ese rango comentado previamente.

Representemos de forma gráfica la cosa:
En una punta tengo -2,147,483,648, en medio tengo el cero y en la otra punta tengo 2,147,483,647

Código C:
Ver original
  1. -2,147,483,648................0....................2,147,483,647

si intento pasar de: 2,147,483,648 lo que sucede es que volvemos a empezar.

Código C:
Ver original
  1. *->  -2,147,483,648................0....................2,147,483,648 |----*
  2. |                                                                          |
  3. |                                                                          |
  4. |                                                                          |
  5. *--------------------------------------------------------------------------*

Se parece un bucle.
La prueba es esta:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3.  
  4. int main (){
  5.    
  6.     int n = 2147483647;
  7.    
  8.     printf("El limite de un entero es: %d\n\n", n);
  9.    
  10.     n++;
  11.    
  12.     printf("Entramos por la parte negativa: %d\n\n", n );
  13.    
  14.     //si siguimos sumando vamos hacia a cero o sea la "derecha":
  15.     n++;
  16.    
  17.     printf("%d\n\n", n );      
  18.     n++;
  19.    
  20.     printf("%d\n\n", n );    
  21.    
  22.     getchar();
  23.     return 0;
  24. }

La memoria es finita. Al declarar variables la estas "llenando".

Con esas cosas sabemos que:
-La memoria es finita.
-no puedo guardar todo lo que me antoje "HAY UN RANGO" XD
-si me cuelo al pasar por los limites el programa produce errores(BUGS) ya que no va funcionar como deseamos.


¿La solución?
Escoger un tipo de dato mayor, "que me reserve mas memoria", como long, long long, el modificador unsigned que hace que los números negativos estén en la parte positiva. Si no voy a trabajar con negativos puedo decir que los números que se suelen guardar como negativos que se me guarden como positivos junto con la otra mitad, entonces tendría un rango de 0 a 2147483647 * 2 +1.

Marcar una variable con unsigned es como decir que no voy usar espacio para números negativos pero si los necesito para guardar números positivos. Eso hace que la capacidad duplique en los números positivos, puedes comprobar.

En fin cosas que debes saber pero que a lo mejor nadie te lo ha dicho aun XDD

Suerte: