Al escribir un programa debemos elegir correctamente el tipo de datos para nuestras variables. Definir, por ejemplo, todas las variables numéricas como "int", puede acarrear comportamientos extraños en nuestro programa, en el momento que menos nos esperamos (que suele coincidir con el momento exacto en el que presentamos el programa al cliente, a nuestro jefe o al profesor de turno).


Vamos a ver un ejemplo simple en Java, un programa para calcular Fibonacci:

public class Fibonacci {
   public static int fib(int n) {
      if (n < 2) return n;
      int fib0 = 0;
      int fib1 = 1;

      for (int i=2; i <= n; i++) {
         fib1 = fib0 + fib1;
      	 fib0 = fib1 - fib0;
      }
      return fib1;
  }

  public static void main(String[] args) {
  	int n = Integer.parseInt(args[0]);
    System.out.println(n + ": " + fib(n));
  }
}

Parece correcto, ¿no? Pues tiene un grave error. Ejecutamos el programa y... ¿qué ocurre? hasta 46 todo bien... y ¿Fibonacci de 47 un número negativo? ¿Qué está pasando?

Pues es fácil, hemos declarado la función fib(), y las variables fib0 y fib1, como int. Una variable declarada así, es un número de 32 bits. Si nos da igual que quiere decir eso, lo resumo: En un int solo podemos meter números enteros desde -2147483648 hasta 2147483647, ambos incluidos.

Java tiene un tipo de datos básico más largo que int, el tipo long, es decir, que "tiene más memoria", concretamente, 64 bits. Con una variable tipo long, podemos guardar enteros desde -9223372036854775808 hasta 9223372036854775807, ambos incluidos.

Vamos a modificar adecuadamente nuestro programa:

public class Fibonacci {
	public static long fib(int n) {
		if (n < 2) return n;
		long fib0 = 0;
		long fib1 = 1;

		for (int i=2; i <= n; i++) {
			fib1 = fib0 + fib1;
			fib0 = fib1 - fib0;
		}
		return fib1;
	}       

	public static void main(String[] args) {
		int n = Integer.parseInt(args[0]);
		System.out.println(n + ": " + fib(n));
	}
} 

Ahora compilamos, (¡y no nos olvidamos de compilar, o vais a ver el mismo resultado de antes!), y vemos que la aplicación soporta una entrada mucho mayor.

Ahora nuestro programa soporta un valor de la entrada mucho más alto, y si esto fuera algo más serio (con todo el respeto que se merece Don Fibonacci), deberíamos controlar siempre los posibles valores de entrada, filtrando valores demasiado grandes y evitar, así, los terribles errores de ejecución.

Tened en cuenta, siempre, que en las películas si un software está mal programado los ordenadores explotan ;-)