Computación por dentro Tema 2
Bits y bytes
Dentro del ordenador solo hay interruptores: cada uno está apagado o encendido. Con eso, y solo con eso, se guardan los números, los textos, las fotos y tus programas.
El bit y el byte#
Un bit es uno de esos interruptores: vale 0 (apagado) o 1 (encendido). Un bit solo no dice mucho, así que se agrupan de 8 en 8: 8 bits son un byte.
| Unidad | Cuánto es | Más o menos… |
|---|---|---|
| Bit | 0 o 1 | Un interruptor |
| Byte | 8 bits | Una letra |
| Kilobyte (KB) | 1.000 bytes | Una página de texto |
| Megabyte (MB) | 1.000 KB | Una foto del móvil, unos pocos MB |
| Gigabyte (GB) | 1.000 MB | Una película, unos pocos GB |
| Terabyte (TB) | 1.000 GB | Un disco duro |
Contar en binario#
Contamos en decimal porque tenemos diez dedos: cada cifra va del 0 al 9. El ordenador cuenta en binario: cada cifra es un bit, 0 o 1.
El truco para leer un número binario: cada casilla vale el doble que la de su derecha (1, 2, 4, 8, 16…). Se suman las casillas que están a 1:
Con un byte, el número más grande es 11111111: 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255. Por eso tantas cosas en informática van de 0 a 255.
Para pasar un número decimal a binario, ve restando las casillas de mayor a menor: 13 = 8 + 4 + 1, así que es 00001101.
El hexadecimal#
Escribir unos y ceros es largo y fácil de equivocarse. El hexadecimal lo resume: cada cifra hexadecimal son 4 bits, y va del 0 al 15. Como no hay cifras para el 10 o el 15, se usan letras:
| Decimal | Hexadecimal | Binario |
|---|---|---|
| 0 | 0 | 0000 |
| 1 | 1 | 0001 |
| … | … | … |
| 9 | 9 | 1001 |
| 10 | A | 1010 |
| 11 | B | 1011 |
| 12 | C | 1100 |
| 13 | D | 1101 |
| 14 | E | 1110 |
| 15 | F | 1111 |
Así, dos cifras hexadecimales son justo un byte: FF = 11111111 = 255.
Ya lo has visto en los colores: #007AFB son tres bytes, cuánto rojo, cuánto verde y cuánto azul:
En Java#
Java te deja escribir números en binario (con 0b delante) y en hexadecimal (con 0x), y pasarlos a texto:
System.out.println(0b111); // binario
System.out.println(0xFF); // hexadecimal
System.out.println(Integer.toBinaryString(65));
System.out.println(Integer.toHexString(255));7
255
1000001
ffCada tipo, su tamaño#
Cada tipo de Java ocupa siempre los mismos bytes, tenga el número que tenga. Un int con un 7 ocupa lo mismo que uno con 2.000.000:
| Tipo | Ocupa | Guarda |
|---|---|---|
byte | 1 byte | Números de −128 a 127 |
char | 2 bytes | Un carácter |
int | 4 bytes | Números de unos −2.000 millones a 2.000 millones |
long | 8 bytes | Números enormes, hasta 9 trillones |
double | 8 bytes | Números con decimales |
boolean | Java no lo fija | true o false: bastaría un bit, pero ningún ordenador guarda un bit suelto |
Cuando el número no cabe: el desbordamiento#
¿Qué pasa si al int más grande le sumas 1? No cabe, y da la vuelta, como un cuentakilómetros:
int maximo = Integer.MAX_VALUE;
System.out.println(maximo);
System.out.println(maximo + 1);2147483647
-2147483648Java no avisa: el programa sigue con un número negativo que no tiene sentido. Si tus números pueden ser muy grandes, usa long.
Los decimales no son exactos#
Un double guarda los decimales en binario, y hay números que en binario no se pueden escribir exactos, igual que 1/3 en decimal es 0,3333… sin fin. Por eso:
System.out.println(0.1 + 0.2);0.30000000000000004Atención
No compares dos double con ==: puede salir false aunque «deberían» ser iguales. Y no uses double para dinero si necesitas los céntimos exactos.
Los textos también son números#
Una letra es un número con una tabla que dice qué letra es cada número. En la tabla básica, ASCII, la A es el 65, la B el 66… Por eso en Java un char se puede usar como número:
char letra = 'A';
System.out.println((int) letra);
System.out.println((char) (letra + 1));65
BASCII solo tiene letras inglesas. Para la ñ, las tildes, los emojis o el chino está Unicode, y la forma más usada de guardarlo en un fichero es UTF-8: las letras inglesas ocupan 1 byte, y la á o la ñ, 2.
Si un programa guarda un texto en UTF-8 y otro lo lee pensando que es otra tabla, cada byte se lee como una letra distinta: á sale como á. Ese es el famoso error de las tildes rotas.
Errores frecuentes#
| Lo que pasa | Por qué | Solución |
|---|---|---|
| Un número sale negativo sin motivo | Desbordamiento: el resultado no cabía en un int | Usa long |
0.1 + 0.2 == 0.3 da false | Los double no son exactos | Compara si la diferencia es muy pequeña: Math.abs(a - b) < 0.0001 |
Las tildes salen como á | El fichero se escribió con una codificación y se lee con otra | Usa UTF-8 al escribir y al leer |
| Un disco de 1 TB sale como 931 GB | El fabricante cuenta 1 TB = 1.000.000.000.000 bytes, y Windows divide entre 1.024 en vez de entre 1.000 | No falta nada: son dos formas de contar |