Codificación de números
Cómo se guarda un número decimal dígito a dígito, cómo se representa que sea negativo, cómo se guardan los decimales y cómo se convierte cualquier dato binario en texto transportable.
Códigos decimales codificados en binario
A veces no interesa convertir el número entero a binario, sino guardar cada dígito decimal por separado en 4 bits. Es lo que hacen los códigos BCD (Binary Coded Decimal). Ocupan más espacio que la conversión pura, pero permiten mostrar o imprimir cada dígito sin tener que deshacer ninguna conversión, que es justo lo que necesita una calculadora o un display.
| Código | Pesos | Cómo se forma |
|---|---|---|
| BCD natural | 8, 4, 2, 1 | Cada dígito decimal se escribe en 4 bits con su valor binario habitual: el 6 es 0110. |
| Aiken | 2, 4, 2, 1 | Cambia los pesos y tiene su propia tabla de equivalencias: el 6 es 1100. |
| Exceso a 3 (XS-3) | Sin pesos fijos | A cada dígito se le suman 3 antes de escribirlo en 4 bits: el 0 es 0011 y el 8 es 1011. |
El decimal 16, digito a digito:
BCD -> 0001 0110
Aiken -> 0001 1100
XS-3 -> 0100 1001 (1+3=4 y 6+3=9)En BCD nada se convierte de golpe: se codifica cada dígito por separado en 4 bits, y por eso el resultado se lee de dos en dos grupos.
Para el examen
BCD natural: pesos 8-4-2-1
Aiken: pesos 2-4-2-1
Exceso a 3: suma 3 a cada dígito antes de escribirlo en binario
Representación del signo: signo-magnitud, CA1 y CA2
En binario no hay un símbolo para el menos, así que el signo se codifica con bits como todo lo demás. Hay tres formas de hacerlo, y las tres reservan el bit de más a la izquierda para el signo: 0 significa positivo y 1 significa negativo.
| Representación | Cómo se obtiene el negativo | Con 4 bits |
|---|---|---|
| Signo y magnitud | Se cambia solo el bit de signo y se deja el valor absoluto tal cual. | De -7 a +7, con dos ceros (0000 y 1000). |
| Complemento a 1 (CA1) | Se invierten todos los bits: cada 0 pasa a 1 y cada 1 pasa a 0. | De -7 a +7, con dos ceros (0000 y 1111). |
| Complemento a 2 (CA2) | Se calcula el complemento a 1 y se le suma 1. | De -8 a +7, con un solo cero. |
El complemento a 2 es el que usan en la práctica los procesadores y los lenguajes, y en Java los enteros se representan internamente así. La razón es doble: no gasta dos combinaciones distintas en el cero y permite restar sumando, con lo que el hardware necesita un solo circuito sumador.
La regla del rango no depende de que sean cuatro bits. Con n bits en complemento a 2 se cubre desde menos 2 elevado a (n menos 1) hasta 2 elevado a (n menos 1) menos 1: con 8 bits, de -128 a 127; con 16 bits, de -32768 a 32767. Siempre hay un negativo más que positivos, porque el cero ocupa una sola combinación y cae del lado positivo.
El desequilibrio del rango es la pista: si los extremos son simétricos, no es complemento a 2.
Para el examen
Complemento a 1: invertir todos los bits
Complemento a 2: invertir y sumar 1
Por qué gana CA2: tiene un solo cero y es lo que usan los procesadores
Rango en CA2 con n bits: de -2^(n-1) a 2^(n-1)-1
Rango con 8 bits: de -128 a 127
Coma flotante: el estándar IEEE 754
Los números con decimales no se guardan con una coma fija, sino en notación científica binaria: un signo, un exponente que dice dónde va la coma y una mantisa con las cifras significativas. El estándar que fija ese formato es IEEE 754, y define dos tamaños de uso general.
| Formato | Signo | Exponente | Mantisa | Total |
|---|---|---|---|---|
| Precisión simple | 1 bit | 8 bits | 23 bits | 32 bits |
| Precisión doble | 1 bit | 11 bits | 52 bits | 64 bits |
El exponente no se guarda con signo propio: se almacena en exceso, sumándole un sesgo fijo que vale 127 en precisión simple y 1023 en doble. Así el campo siempre es un número sin signo y se pueden comparar dos flotantes casi como si fueran enteros. Eso explica por qué en precisión simple el exponente útil va de 1 a 254: los valores 0 y 255 están reservados para representar el cero, los números subnormales, el infinito y NaN (el resultado no numérico).
Signo, exponente y mantisa, en ese orden y siempre. Lo que cambia entre simple y doble precisión es cuántos bits se lleva cada campo.
Para el examen
IEEE 754 precisión simple: 1 signo + 8 exponente + 23 mantisa = 32 bits
IEEE 754 precisión doble: 1 + 11 + 52 = 64 bits
Sesgo del exponente: 127 en simple y 1023 en doble
Valores reservados del exponente: el 0 y el 255
Base64 y PEM
Base64 no es un sistema de numeración, es un sistema de codificación: convierte datos binarios cualesquiera en una cadena de caracteres imprimibles, para poder meterlos donde solo se admite texto (el cuerpo de un correo, un atributo de un documento, una URL). No cifra nada y no comprime nada: cualquiera puede deshacerlo.
El mecanismo es tomar los bits de seis en seis empezando por la izquierda, porque con 6 bits se representan 64 valores distintos, y traducir cada grupo por un carácter de un alfabeto de 64 símbolos: las 26 mayúsculas, las 26 minúsculas, los 10 dígitos y los signos «+» y «/». Como 3 bytes de entrada dan 4 caracteres de salida, el resultado ocupa aproximadamente un 33 por ciento más que el original.
Codificar el texto «Sol»
S = 01010011 o = 01101111 l = 01101100
Se reagrupa de 6 en 6 bits:
010100 110110 111101 101100
20 54 61 44
U 2 9 s
Resultado: U29sSi los bytes de entrada no son múltiplo de tres, el último grupo se completa con el carácter «=», que actúa de relleno o padding y no aporta información. Nunca hacen falta más de dos, y siempre van al final, a la derecha. Sobre Base64 se apoya el formato PEM, que es el que exporta certificados y claves como texto delimitado por líneas de cabecera y cierre.
6 bits por carácter, 64 símbolos, un tercio más de tamaño y como mucho dos signos igual de relleno al final.
Para el examen
Qué NO hace: ni cifra ni comprime
Bits por símbolo: 6
Aumento de tamaño: aproximadamente un 33 %
Relleno: hasta dos signos «=» al final
PEM: exporta certificados y claves como texto apoyándose en Base64