La primera vez que llamé no fui capaz de decirle las letras que me pedía hasta el tercer intento por lo menos. ¿Qué pasó?
Sencillo: estaba contando los caracteres como si estuviese programando, empezando por 0.
Normalmente, procederíamos así a la hora de contar (en la línea de arriba, la palabra, en la de abajo, la numeración o posiciones):
C | o | n | t | r | a | s | e | ñ | a
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
Sin embargo, un programador contará así:
C | o | n | t | r | a | s | e | ñ | a
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Casi todos los lenguajes de programación y sistemas siguen este esquema: empezar a contar desde cero. ¿Por qué se hace de esta forma tan poco intuitiva?
La razón que me parece más sencilla es la siguiente: el número 0 también contiene información.
Cuando utilizamos los números naturales para contar empezamos con el 1 porque el 0 no tiene significado: si no hay nada que contar, no contamos. Si hay algo que contar, empezamos por la unidad: "una manzana, dos manzanas, ..."
Sin embargo en los ordenadores cuando contamos en realidad lo que estamos es enumerando direcciones o posiciones.
Vamos a ver un sencillo ejemplo:
Supongamos que tenemos una ínfima memoria RAM de 8 bytes. Esto quiere decir que sólo disponemos de 8 "huecos", "casillas", posiciones o direcciones de memoria.
Podemos pensar en la memoria RAM como en un montón de buzones de correo apilados.
Si queremos acceder a una de estas direcciones para recuperar el contenido o escribir algo necesitamos saber su dirección. Como sabemos, los ordenadores sólo utilizan ceros y unos para contar, así que con tres bits seremos capaces de direccionar toda la memoria:
000 - 001 - 010 - 011 - 100 - 101 - 110 - 111
Estas ternas de números binarios son en el sistema decimal:
0 - 1 - 2 - 3 - 4 - 5 - 6 - 7
Así que tendremos el buzón 0, el buzón 1, el buzón 2, ... hasta el buzón 7. Total, 8 buzones.
Si nos hubiésemos empeñado en numerar los buzones desde el número 1 no nos hubiesen bastado 3 bits (*), puesto que el número 8 en binario es 1000 (**).
Los mayoría de los lenguajes de programación trata las cadenas de texto de la misma forma. Por ejemplo, el lenguaje PHP (con el cual están programados estos blogs) tiene una función o instrucción para extraer parte de una cadena de texto:
substr('Contraseña', 1, 5) nos proporciona 5 caracteres de la palabra 'Contraseña' a partir de la posición 1, esto es, "ontra".
Como ven, también cuentan desde 0.
Notas
(*) Existe una regla muy sencilla para saber cuántas posiciones podemos abarcar con n bits: 2^n.
- Con 3 bits podemos contar 2^3 = 8 posiciones, esto es, del 0 al 7.
- Con 4 bits podemos contar hasta 2^4=16 posiciones (del 0 al 15).
Un ordenador que funcione con 32 bits (los Pentium "clásicos", por ejemplo) podrá direccionar 2^32 = 4.294.967.296 direcciones, es decir, 4 Gigas de memoria. No compre más memoria que esta cantidad para su viejo Pentium. No podrá utilizarla.
(**) A los informáticos también se nos dan muy bien las potencias del número 2. Pregúntenle a un programador "¿cuanto es 2^10?". Seguro que le contesta con bastante rapidez ;-)