En sistemas informáticos y electrónicos , el sistema decimal codificado en binario ( BCD ) es una clase de codificación binaria de números decimales en la que cada dígito se representa mediante un número fijo de bits , normalmente cuatro u ocho. A veces, se utilizan patrones de bits especiales para un signo u otras indicaciones (por ejemplo, error o desbordamiento).
En los sistemas orientados a bytes (es decir, la mayoría de las computadoras modernas), el término BCD descomprimido [1] generalmente implica un byte completo para cada dígito (que a menudo incluye un signo), mientras que el BCD empaquetado generalmente codifica dos dígitos dentro de un solo byte aprovechando el hecho de que cuatro bits son suficientes para representar el rango de 0 a 9. Sin embargo, la codificación precisa de cuatro bits puede variar por razones técnicas (por ejemplo, Excess-3 ).
Los diez estados que representan un dígito BCD a veces se denominan tétradas [2] [3] (el nibble que normalmente se necesita para contenerlos también se conoce como tétrada), mientras que los estados no utilizados, que no importan , se denominan pseudo-tetrad(e)s , [4] [5] [6] [7] [8] pseudo-decimales [3] o dígitos pseudo-decimales . [9] [10] [nb 1]
La principal virtud del BCD, en comparación con los sistemas posicionales binarios , es su representación y redondeo más precisos de cantidades decimales, así como su facilidad de conversión a representaciones convencionales legibles por humanos. Sus principales desventajas son un ligero aumento en la complejidad de los circuitos necesarios para implementar la aritmética básica, así como un almacenamiento ligeramente menos denso.
El sistema BCD se utilizó en muchas de las primeras computadoras decimales y se implementa en el conjunto de instrucciones de máquinas como la serie IBM System/360 y sus descendientes, el VAX de Digital Equipment Corporation , el Burroughs B1700 y los procesadores Motorola de la serie 68000 .
El BCD en sí no se utiliza tan ampliamente como en el pasado y no está disponible o está limitado en los conjuntos de instrucciones más nuevos (por ejemplo, ARM ; x86 en modo largo ). Sin embargo, los formatos decimales de punto fijo y decimales de punto flotante siguen siendo importantes y se siguen utilizando en la informática financiera, comercial e industrial, donde no se pueden tolerar los errores sutiles de conversión y redondeo fraccionario que son inherentes a los formatos binarios de punto flotante. [11]
El BCD aprovecha el hecho de que cualquier número decimal puede representarse mediante un patrón de cuatro bits. Una forma obvia de codificar dígitos es el BCD natural (NBCD), donde cada dígito decimal se representa mediante su valor binario de cuatro bits correspondiente, como se muestra en la siguiente tabla. Esto también se denomina codificación "8421".
Dígito decimal | BCD | |||
---|---|---|---|---|
8 | 4 | 2 | 1 | |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 |
2 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 1 | 1 |
4 | 0 | 1 | 0 | 0 |
5 | 0 | 1 | 0 | 1 |
6 | 0 | 1 | 1 | 0 |
7 | 0 | 1 | 1 | 1 |
8 | 1 | 0 | 0 | 0 |
9 | 1 | 0 | 0 | 1 |
Este esquema también puede denominarse Decimal Codificado Binario Simple ( SBCD ) o BCD 8421 , y es la codificación más común. [12] Otras incluyen las denominadas codificaciones "4221" y "7421" -nombradas así por la ponderación utilizada para los bits- y " Excess-3 ". [13] Por ejemplo, el dígito BCD 6, 0110'b
en notación 8421, está 1100'b
en 4221 (son posibles dos codificaciones), 0110'b
en 7421, mientras que en Excess-3 está 1001'b
( ).
Poco | Peso | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Comentario |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Binario |
3 | 4 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | |
2 | 2 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | |
1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | |
Nombre | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Decimal | |
8 4 2 1 (tallas XS a 0) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | [14] [15] [16] [17] [nota 2] | |
7 4 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [18] [19] [20] | |||||||
Aiken (2421) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [14] [15] [16] [17] [nota 3] | |||||||
Exceso-3 (XS-3) | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | [14] [15] [16] [17] [nota 2] | |
Exceso-6 (XS-6) | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [18] [n.º 2] | |
Salto a las 2 (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [16] [17] | |||||||
Salto a las 8 (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [21] [22] [16] [17] [nota 4] | |||||||
4 2 2 1 (yo) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [16] [17] | |||||||
4 2 2 1 (II) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [21] [22] | |||||||
5 4 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [18] [14] [16] [17] | |||||||
5 2 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [14] [16] [17] | |||||||
5 1 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [19] | |||||||
5 3 1 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [16] [17] | |||||||
Blanco (5 2 1 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [23] [18] [14] [16] [17] | |||||||
5 2 1 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | [24] | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
Cinta magnética | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [15] | |||||||
Pablo | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 0 | 8 | 9 | [25] | |||||||
Gris | 0 | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 15 | 14 | 12 | 13 | 8 | 9 | 11 | 10 | [26] [14] [15] [16] [17] [nota 2] | |
Glixon | 0 | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 9 | 8 | [27] [14] [15] [16] [17] | |||||||
Ledley | 0 | 1 | 3 | 2 | 7 | 6 | 4 | 5 | 8 | 9 | [28] | |||||||
4 3 1 1 | 0 | 1 | 2 | 3 | 5 | 4 | 6 | 7 | 8 | 9 | [19] | |||||||
LARC | 0 | 1 | 2 | 4 | 3 | 5 | 6 | 7 | 9 | 8 | [29] | |||||||
Claro | 0 | 1 | 2 | 4 | 3 | 9 | 8 | 7 | 5 | 6 | [2] [3] | |||||||
Petherick (RAE) | 1 | 3 | 2 | 0 | 4 | 8 | 6 | 7 | 9 | 5 | [30] [31] [n.º 5] | |||||||
O'Brien I (Watts) | 0 | 1 | 3 | 2 | 4 | 9 | 8 | 6 | 7 | 5 | [32] [14] [16] [17] [nota 6] | |||||||
5-cíclico | 0 | 1 | 3 | 2 | 4 | 5 | 6 | 8 | 7 | 9 | [28] | |||||||
Tompkins yo | 0 | 1 | 3 | 2 | 4 | 9 | 8 | 7 | 5 | 6 | [33] [14] [16] [17] | |||||||
Labio | 0 | 1 | 2 | 3 | 4 | 9 | 8 | 7 | 6 | 5 | [34] [35] [14] | |||||||
O'Brien II | 0 | 2 | 1 | 4 | 3 | 9 | 7 | 8 | 5 | 6 | [32] [14] [16] [17] | |||||||
Tompkins II | 0 | 1 | 4 | 3 | 2 | 7 | 9 | 8 | 5 | 6 | [33] [14] [16] [17] | |||||||
Exceso-3 Gris | -3 | -2 | 0 | -1 | 4 | 3 | 1 | 2 | 12 | 11 | 9 | 10 | 5 | 6 | 8 | 7 | [16] [17] [20] [n.° 7] [n.° 2] | |
6 3 −2 −1 (yo) | 3 | 2 | 1 | 0 | 5 | 4 | 8 | 9 | 7 | 6 | [29] [36] | |||||||
6 3 −2 −1 (II) | 0 | 3 | 2 | 1 | 6 | 5 | 4 | 9 | 8 | 7 | [29] [36] | |||||||
8 4 −2 −1 | 0 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 9 | [29] | |||||||
Lucal | 0 | 15 | 14 | 1 | 12 | 3 | 2 | 13 | 8 | 7 | 6 | 9 | 4 | 11 | 10 | 5 | [37] | |
Kautz yo | 0 | 2 | 5 | 1 | 3 | 7 | 9 | 8 | 6 | 4 | [18] | |||||||
Kautz II | 9 | 4 | 1 | 3 | 2 | 8 | 6 | 7 | 0 | 5 | [18] [14] | |||||||
Susskind yo | 0 | 1 | 4 | 3 | 2 | 9 | 8 | 5 | 6 | 7 | [35] | |||||||
Susskind II | 0 | 1 | 9 | 8 | 4 | 3 | 2 | 5 | 6 | 7 | [35] | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
La siguiente tabla representa los dígitos decimales del 0 al 9 en varios sistemas de codificación BCD. En los encabezados, el " " indica el peso de cada bit. En la quinta columna ("BCD 8 4 −2 −1"), dos de los pesos son negativos. También se muestran los códigos de caracteres ASCII y EBCDIC para los dígitos, que son ejemplos de BCD zonificado.8 4 2 1
Dígito | CBC 8 4 2 1 | Código Stibitz o Exceso-3 | Código Aiken o BCD 2 4 2 1 | CBC 8 4 −2 −1 | IBM 702 , IBM 705 , IBM 7080 , IBM 1401 8421 | ASCII 0000 8421 | Código electrónico de identificación electrónica 0000 8421 |
---|---|---|---|---|---|---|---|
0 | 0000 | 0011 | 0000 | 0000 | 1010 | 0011 0000 | 1111 0000 |
1 | 0001 | 0100 | 0001 | 0111 | 0001 | 0011 0001 | 1111 0001 |
2 | 0010 | 0101 | 0010 | 0110 | 0010 | 0011 0010 | 1111 0010 |
3 | 0011 | 0110 | 0011 | 0101 | 0011 | 0011 0011 | 1111 0011 |
4 | 0100 | 0111 | 0100 | 0100 | 0100 | 0011 0100 | 1111 0100 |
5 | 0101 | 1000 | 1011 | 1011 | 0101 | 0011 0101 | 1111 0101 |
6 | 0110 | 1001 | 1100 | 1010 | 0110 | 0011 0110 | 1111 0110 |
7 | 0111 | 1010 | 1101 | 1001 | 0111 | 0011 0111 | 1111 0111 |
8 | 1000 | 1011 | 1110 | 1000 | 1000 | 0011 1000 | 1111 1000 |
9 | 1001 | 1100 | 1111 | 1111 | 1001 | 0011 1001 | 1111 1001 |
Como la mayoría de las computadoras manejan datos en bytes de 8 bits , es posible utilizar uno de los siguientes métodos para codificar un número BCD:
A modo de ejemplo, codificar el número decimal 91
utilizando BCD descomprimido da como resultado el siguiente patrón binario de dos bytes:
Decimal: 9 1Binario: 0000 1001 0000 0001
En BCD empaquetado, el mismo número cabría en un solo byte:
Decimal: 9 1Binario: 1001 0001
Por lo tanto, el rango numérico para un byte BCD descomprimido es de cero a nueve inclusive, mientras que el rango para un byte BCD empaquetado es de cero a noventa y nueve inclusive.
Para representar números mayores que el rango de un solo byte, se puede utilizar cualquier cantidad de bytes contiguos. Por ejemplo, para representar el número decimal 12345
en BCD empaquetado, utilizando el formato big-endian , un programa codificaría de la siguiente manera:
Decimales: 0 1 2 3 4 5Binario: 0000 0001 0010 0011 0100 0101
Aquí, el nibble más significativo del byte más significativo se ha codificado como cero, por lo que el número se almacena como 012345
(pero las rutinas de formato pueden reemplazar o eliminar los ceros iniciales). El BCD empaquetado es más eficiente en el uso del almacenamiento que el BCD desempaquetado; codificar el mismo número (con el cero inicial) en formato desempaquetado consumiría el doble de almacenamiento.
Las operaciones de desplazamiento y enmascaramiento se utilizan para comprimir o descomprimir un dígito BCD comprimido. Otras operaciones bit a bit se utilizan para convertir un número en su patrón de bits equivalente o invertir el proceso.
En BCD empaquetado (o decimal empaquetado [38] ), cada nibble representa un dígito decimal. [nb 8] El BCD empaquetado se ha utilizado al menos desde la década de 1960 y se ha implementado en todo el hardware de mainframe de IBM desde entonces. La mayoría de las implementaciones son big endian , es decir, con el dígito más significativo en la mitad superior de cada byte, y con el byte más a la izquierda (que reside en la dirección de memoria más baja) que contiene los dígitos más significativos del valor decimal empaquetado. El nibble inferior del byte más a la derecha se utiliza normalmente como indicador de signo, aunque algunas representaciones sin signo carecen de un indicador de signo.
Por ejemplo, un valor de 4 bytes consta de 8 nibbles, en los que los 7 nibbles superiores almacenan los dígitos de un valor decimal de 7 dígitos y el nibble inferior indica el signo del valor entero decimal. Los valores de signo estándar son 1100 ( hexadecimal C) para positivo (+) y 1101 (D) para negativo (−). Esta convención proviene del campo de zona para caracteres EBCDIC y la representación de sobrepunción con signo .
Otros signos permitidos son 1010 (A) y 1110 (E) para positivo y 1011 (B) para negativo. Los procesadores IBM System/360 utilizarán los signos 1010 (A) y 1011 (B) si el bit A está establecido en el PSW, para el estándar ASCII-8 que nunca pasó. La mayoría de las implementaciones también proporcionan valores BCD sin signo con un nibble de signo de 1111 (F). [39] [40] [41] ILE RPG utiliza 1111 (F) para positivo y 1101 (D) para negativo. [42] Estos coinciden con la zona EBCDIC para dígitos sin un sobrepunzón de signo. En BCD empaquetado, el número 127 se representa con 0001 0010 0111 1100 (127C) y −127 se representa con 0001 0010 0111 1101 (127D). Los sistemas de Burroughs usaban 1101 (D) para el signo negativo, y cualquier otro valor se considera un valor de signo positivo (los procesadores normalizarán un signo positivo a 1100 (C)).
Dígito de signo | CBC 8 4 2 1 | Firmar | Notas |
---|---|---|---|
A | 1 0 1 0 | + | |
B | 1 0 1 1 | − | |
do | 1 1 0 0 | + | Privilegiado |
D | 1 1 0 1 | − | Privilegiado |
mi | 1 1 1 0 | + | |
F | 1 1 1 1 | + | No firmado |
No importa cuántos bytes de ancho tenga una palabra , siempre hay un número par de nibbles porque cada byte tiene dos de ellos. Por lo tanto, una palabra de n bytes puede contener hasta (2 n )−1 dígitos decimales, que siempre es un número impar de dígitos. Un número decimal con d dígitos requiere 1/2 ( d +1) bytes de espacio de almacenamiento.
Por ejemplo, una palabra de 4 bytes (32 bits) puede contener siete dígitos decimales más un signo y puede representar valores que van desde ±9.999.999. Por lo tanto, el número −1.234.567 tiene 7 dígitos de ancho y se codifica como:
0001 0010 0011 0100 0101 0110 0111 11011 2 3 4 5 6 7 −
Al igual que las cadenas de caracteres, el primer byte del decimal empaquetado (aquel con los dos dígitos más significativos) generalmente se almacena en la dirección más baja de la memoria, independientemente del orden de bytes de la máquina.
Por el contrario, un entero binario de complemento a dos de 4 bytes puede representar valores desde −2.147.483.648 hasta +2.147.483.647.
Si bien el BCD empaquetado no hace un uso óptimo del almacenamiento (utiliza aproximadamente un 20% más de memoria que la notación binaria para almacenar los mismos números), la conversión a ASCII , EBCDIC o las diversas codificaciones de Unicode se vuelve trivial, ya que no se requieren operaciones aritméticas. Los requisitos de almacenamiento adicional generalmente se compensan con la necesidad de precisión y compatibilidad con calculadora o cálculo manual que proporciona la aritmética decimal de punto fijo. Existen empaquetamientos más densos de BCD que evitan la penalización de almacenamiento y tampoco necesitan operaciones aritméticas para las conversiones comunes.
El BCD empaquetado se admite en el lenguaje de programación COBOL como el tipo de datos "COMPUTATIONAL-3" (una extensión de IBM adoptada por muchos otros proveedores de compiladores) o "PACKED-DECIMAL" (parte del estándar COBOL de 1985). Se admite en PL/I como "FIXED DECIMAL". Además de IBM System/360 y mainframes compatibles posteriores, el BCD empaquetado se implementa en el conjunto de instrucciones nativo de los procesadores VAX originales de Digital Equipment Corporation y algunos modelos de mainframes de la serie SDS Sigma , y es el formato nativo de la línea de mainframes Burroughs Medium Systems (descendiente de la serie Electrodata 200 de los años 1950).
Las representaciones en complemento a diez para números negativos ofrecen un enfoque alternativo para codificar el signo de números BCD empaquetados (y otros). En este caso, los números positivos siempre tienen un dígito más significativo entre 0 y 4 (inclusive), mientras que los números negativos se representan mediante el complemento a 10 del número positivo correspondiente.
Como resultado, este sistema permite que los números BCD empaquetados de 32 bits oscilen entre −50 000 000 y +49 999 999, y −1 se representa como 99999999. (Al igual que con los números binarios de complemento a dos, el rango no es simétrico respecto del cero).
Algunos lenguajes de programación (como COBOL y PL/I) admiten números decimales con punto fijo . Estos lenguajes permiten al programador especificar un punto decimal implícito delante de uno de los dígitos.
Por ejemplo, un valor decimal empaquetado codificado con los bytes 12 34 56 7C representa el valor de punto fijo +1.234,567 cuando el punto decimal implícito se encuentra entre el cuarto y el quinto dígito:
12 34 56 7C 12 34.56 7+
El punto decimal no se almacena en la memoria, ya que el formato de almacenamiento BCD empaquetado no lo permite. El compilador simplemente conoce su ubicación y el código generado actúa en consecuencia para las distintas operaciones aritméticas.
Si un dígito decimal requiere cuatro bits, entonces tres dígitos decimales requieren 12 bits. Sin embargo, dado que 2 10 (1024) es mayor que 10 3 (1000), si se codifican tres dígitos decimales juntos, solo se necesitan 10 bits. Dos de estas codificaciones son la codificación Chen-Ho y la codificación decimal densamente empaquetada (DPD). Esta última tiene la ventaja de que los subconjuntos de la codificación codifican dos dígitos en los siete bits óptimos y un dígito en cuatro bits, como en el BCD regular.
Algunas implementaciones, por ejemplo, los sistemas mainframe de IBM , admiten representaciones numéricas decimales por zonas . Cada dígito decimal se almacena en un byte, y los cuatro bits inferiores codifican el dígito en formato BCD. Los cuatro bits superiores, denominados bits de "zona", suelen tener un valor fijo para que el byte contenga un valor de carácter correspondiente al dígito. Los sistemas EBCDIC utilizan un valor de zona de 1111 (hexadecimal F); esto produce bytes en el rango F0 a F9 (hexadecimal), que son los códigos EBCDIC para los caracteres "0" a "9". De manera similar, los sistemas ASCII utilizan un valor de zona de 0011 (hexadecimal 3), lo que da lugar a los códigos de caracteres del 30 al 39 (hexadecimal).
Para los valores decimales con signo, el nibble de la zona más a la derecha (menos significativo) contiene el dígito del signo, que es el mismo conjunto de valores que se utilizan para los números decimales empaquetados con signo (ver arriba). Por lo tanto, un valor decimal con signo codificado como los bytes hexadecimales F1 F2 D3 representa el valor decimal con signo −123:
Dos, tres, cuatro1 2 −3
Dígito BCD | Hexadecimal | Carácter EBCDIC | ||||||
---|---|---|---|---|---|---|---|---|
0+ | C0 | A0 | E0 | F0 | { (*) | \ (*) | 0 | |
1+ | C1 | A1 | E1 | F1 | A | ~ (*) | 1 | |
2+ | C2 | A2 | E2 | F2 | B | s | S | 2 |
3+ | C3 | A3 | E3 | F3 | do | a | yo | 3 |
4+ | C4 | A4 | E4 | F4 | D | tú | tú | 4 |
5+ | C5 | A5 | E5 | F5 | mi | en | V | 5 |
6+ | C6 | A6 | E6 | F6 | F | el | Yo | 6 |
7+ | C7 | A7 | E7 | F7 | GRAMO | incógnita | incógnita | 7 |
8+ | C8 | A8 | E8 | F8 | yo | y | Y | 8 |
9+ | C9 | A9 | E9 | F9 | I | el | O | 9 |
0− | D0 | B0 | } (*) | ^ (*) | ||||
1− | D1 | B1 | Yo | |||||
2− | D2 | B2 | K | |||||
3− | D3 | B3 | yo | |||||
4− | D4 | B4 | METRO | |||||
5− | D5 | B5 | norte | |||||
6− | D6 | B6 | Oh | |||||
7− | D7 | B7 | PAG | |||||
8− | D8 | B8 | Q | |||||
9− | D9 | B9 | R |
(*) Nota: Estos caracteres varían según la configuración de la página de códigos de caracteres locales .
Algunos lenguajes (como COBOL y PL/I) admiten directamente valores decimales con zona de punto fijo, asignando un punto decimal implícito en alguna ubicación entre los dígitos decimales de un número.
Por ejemplo, dado un valor decimal con signo de seis bytes con un punto decimal implícito a la derecha del cuarto dígito, los bytes hexadecimales F1 F2 F7 F9 F5 C0 representan el valor +1279,50:
F1, F2, F7, F9, F5, C01 2 7 9. 5 +0
Es posible realizar una suma sumando primero en binario y luego convirtiendo a BCD. La conversión de la suma simple de dos dígitos se puede realizar sumando 6 (es decir, 16 − 10) cuando el resultado de cinco bits de la suma de un par de dígitos tiene un valor mayor que 9. La razón para sumar 6 es que hay 16 posibles valores BCD de 4 bits (ya que 2 4 = 16), pero solo 10 valores son válidos (0000 a 1001). Por ejemplo:
1001 + 1000 = 10001 9 + 8 = 17
10001 es la representación binaria, no decimal, del resultado deseado, pero el 1 más significativo (el "carry") no cabe en un número binario de 4 bits. En BCD, al igual que en decimal, no puede existir un valor mayor que 9 (1001) por dígito. Para corregir esto, se suma 6 (0110) al total y luego el resultado se trata como dos nibbles:
10001 + 0110 = 00010111 => 0001 0111 17 + 6 = 23 1 7
Los dos nibbles del resultado, 0001 y 0111, corresponden a los dígitos "1" y "7". Esto da como resultado "17" en BCD, que es el resultado correcto.
Esta técnica se puede extender a la suma de múltiples dígitos mediante la suma en grupos de derecha a izquierda, propagando el segundo dígito como un acarreo, comparando siempre el resultado de 5 bits de cada suma de pares de dígitos con 9. Algunas CPU proporcionan un indicador de medio acarreo para facilitar los ajustes aritméticos BCD después de las operaciones de suma y resta binarias. El Intel 8080 , el Zilog Z80 y las CPU de la familia x86 proporcionan el código de operación DAA (acumulador de ajuste decimal).
La resta se realiza sumando el complemento a diez del sustraendo al minuendo . Para representar el signo de un número en BCD, se utiliza el número 0000 para representar un número positivo y 1001 para representar un número negativo . Las 14 combinaciones restantes son signos no válidos. Para ilustrar la resta con signo en BCD, considere el siguiente problema: 357 − 432.
En BCD con signo, 357 es 0000 0011 0101 0111. El complemento a diez de 432 se puede obtener tomando el complemento a nueve de 432 y luego sumándole uno. Por lo tanto, 999 − 432 = 567 y 567 + 1 = 568. Si se antepone el código de signo negativo al 568 en BCD, se puede representar el número −432. Por lo tanto, −432 en BCD con signo es 1001 0101 0110 1000.
Ahora que ambos números están representados en BCD con signo, se pueden sumar:
0000 0011 0101 0111 0 3 5 7+ 1001 0101 0110 1000 9 5 6 8= 1001 1000 1011 1111 9 8 11 15
Dado que BCD es una forma de representación decimal, varias de las sumas de dígitos anteriores no son válidas. En caso de que exista una entrada no válida (cualquier dígito BCD mayor que 1001), se suma 6 para generar un bit de acarreo y hacer que la suma se convierta en una entrada válida. Por lo tanto, sumar 6 a las entradas no válidas da como resultado lo siguiente:
1001 1000 1011 1111 9 8 11 15+ 0000 0000 0110 0110 0 0 6 6= 1001 1001 0010 0101 9 9 2 5
Por lo tanto, el resultado de la resta es 1001 1001 0010 0101 (−925). Para confirmar el resultado, observe que el primer dígito es 9, lo que significa negativo. Esto parece ser correcto ya que 357 − 432 debería dar como resultado un número negativo. Los nibbles restantes son BCD, por lo que 1001 0010 0101 es 925. El complemento a diez de 925 es 1000 − 925 = 75, por lo que la respuesta calculada es −75.
Si se suman diferentes cantidades de nibbles (como 1053 − 2), el número con menos dígitos debe ir precedido de ceros antes de tomar el complemento a diez o restar. Por lo tanto, con 1053 − 2, 2 tendría que representarse primero como 0002 en BCD y tendría que calcularse el complemento a diez de 0002.
IBM utilizó el término Código de Intercambio Decimal Codificado en Binario (BCDIC, a veces llamado simplemente BCD) para códigos alfanuméricos de 6 bits que representaban números, letras mayúsculas y caracteres especiales. Algunas variaciones de los alfanuméricos BCDIC se utilizan en la mayoría de las primeras computadoras IBM, incluidas la IBM 1620 (introducida en 1959), la serie IBM 1400 y los miembros de arquitectura no decimal de la serie IBM 700/7000 .
Las máquinas IBM de la serie 1400 son direccionables por caracteres, cada ubicación tiene seis bits etiquetados como B, A, 8, 4, 2 y 1, más un bit de verificación de paridad impar ( C ) y un bit de marca de palabra ( M ). Para codificar los dígitos del 1 al 9 , B y A son cero y el valor del dígito representado por el BCD estándar de 4 bits en los bits 8 al 1 . Para la mayoría de los demás caracteres, los bits B y A se derivan simplemente de las perforaciones de "zona 12", "11" y "0" en el código de caracteres de la tarjeta perforada , y los bits 8 al 1 de las perforaciones del 1 al 9. Una perforación de "zona 12" establece tanto B como A , una "zona 11" establece B , y una "zona 0" (una perforación 0 combinada con otras) establece A . Por lo tanto, la letra A , que es (12,1) en el formato de tarjeta perforada, se codifica (B,A,1) . El símbolo de moneda $ , (11,8,3) en la tarjeta perforada, fue codificado en la memoria como (B,8,2,1) . Esto permite que el circuito convierta entre el formato de tarjeta perforada y el formato de almacenamiento interno de manera muy simple con solo unos pocos casos especiales. Un caso especial importante es el dígito 0 , representado por un solo 0 perforado en la tarjeta y (8,2) en la memoria central. [43]
La memoria del IBM 1620 está organizada en dígitos direccionables de 6 bits, los habituales 8, 4, 2, 1 más F , utilizado como bit de bandera y C , un bit de comprobación de paridad impar. Los alfanuméricos BCD se codifican utilizando pares de dígitos, con la "zona" en el dígito direccionado par y el "dígito" en el dígito direccionado impar, estando relacionada la "zona" con los "marcadores de zona" 12 , 11 y 0 como en la serie 1400. Hardware de traducción de entrada/salida convertido entre los pares de dígitos internos y los códigos BCD externos estándar de 6 bits.
En la arquitectura decimal IBM 7070 , IBM 7072 e IBM 7074 , los alfanuméricos se codifican utilizando pares de dígitos (utilizando código de dos de cinco en los dígitos, no BCD) de la palabra de 10 dígitos, con la "zona" en el dígito izquierdo y el "dígito" en el dígito derecho. Hardware de traducción de entrada/salida convertido entre los pares de dígitos internos y los códigos BCD externos estándar de 6 bits.
Con la introducción de System/360 , IBM amplió los caracteres alfanuméricos BCD de 6 bits a EBCDIC de 8 bits, lo que permite la incorporación de muchos más caracteres (por ejemplo, letras minúsculas). También se implementa un tipo de datos numéricos BCD empaquetados de longitud variable , que proporciona instrucciones de máquina que realizan operaciones aritméticas directamente en datos decimales empaquetados.
En IBM 1130 y 1800 , el BCD empaquetado está soportado en el software por el Paquete de Subrutinas Comerciales de IBM.
En la actualidad, los datos BCD se siguen utilizando mucho en bases de datos IBM como IBM Db2 y procesadores como z/Architecture y POWER6 y, posteriormente, procesadores Power ISA . En estos productos, el BCD suele ser BCD zonificado (como en EBCDIC o ASCII), BCD empaquetado (dos dígitos decimales por byte) o codificación BCD "pura" (un dígito decimal almacenado como BCD en los cuatro bits inferiores de cada byte). Todos estos se utilizan en registros de hardware y unidades de procesamiento, y en software.
La serie VAX de Digital Equipment Corporation incluye instrucciones que pueden realizar operaciones aritméticas directamente en datos BCD empaquetados y convertir entre datos BCD empaquetados y otras representaciones de números enteros. [41] El formato BCD empaquetado de VAX es compatible con el de IBM System/360 y los procesadores compatibles posteriores de IBM. Las implementaciones MicroVAX y posteriores de VAX eliminaron esta capacidad de la CPU, pero mantuvieron la compatibilidad de código con máquinas anteriores al implementar las instrucciones faltantes en una biblioteca de software proporcionada por el sistema operativo. Esto se invoca automáticamente a través del manejo de excepciones cuando se encuentran las instrucciones obsoletas, de modo que los programas que las utilizan pueden ejecutarse sin modificaciones en las máquinas más nuevas.
Muchos procesadores tienen soporte de hardware para la aritmética de números enteros codificados en BCD. Por ejemplo, el 6502 , [44] [45] la serie Motorola 68000 , [46] y la serie x86 . [47] La arquitectura x86 de Intel admite un formato BCD único de 18 dígitos (diez bytes) que se puede cargar y almacenar en los registros de punto flotante, desde donde se pueden realizar los cálculos. [48]
En computadoras más recientes, tales capacidades casi siempre se implementan en software en lugar de en el conjunto de instrucciones de la CPU, pero los datos numéricos BCD todavía son extremadamente comunes en aplicaciones comerciales y financieras.
Existen trucos para implementar operaciones de suma o resta de decimales zonificadas y BCD empaquetadas utilizando secuencias cortas pero difíciles de entender de lógica de palabras paralelas y operaciones aritméticas binarias. [49] Por ejemplo, el siguiente código (escrito en C ) calcula una suma BCD empaquetada sin signo de 8 dígitos utilizando operaciones binarias de 32 bits:
uint32_t BCDadd ( uint32_t a , uint32_t b ) { uint32_t t1 , t2 ; // valores intermedios de 32 bits sin signo t1 = a + 0x06666666 ; t2 = t1 ^ b ; // suma sin propagación de acarreo t1 = t1 + b ; // suma provisional t2 = t1 ^ t2 ; // todos los bits de acarreo binario t2 = ~ t2 & 0x11111110 ; // solo los bits de acarreo BCD t2 = ( t2 >> 2 ) | ( t2 >> 3 ); // retorno de corrección t1 - t2 ; // suma BCD corregida }
Esta sección tiene varios problemas. Ayúdanos a mejorarla o a discutir estos problemas en la página de discusión . ( Aprende cómo y cuándo eliminar estos mensajes )
|
El BCD es común en sistemas electrónicos donde se debe mostrar un valor numérico, especialmente en sistemas que consisten únicamente en lógica digital y que no contienen un microprocesador. Al emplear el BCD, la manipulación de datos numéricos para su visualización se puede simplificar en gran medida al tratar cada dígito como un subcircuito individual independiente.
Esto coincide mucho más con la realidad física del hardware de visualización: un diseñador podría optar por utilizar una serie de pantallas independientes de siete segmentos idénticos para construir un circuito de medición, por ejemplo. Si la cantidad numérica se almacenara y manipulara como binario puro, la interfaz con una pantalla de este tipo requeriría circuitos complejos. Por lo tanto, en los casos en que los cálculos son relativamente simples, trabajar con BCD puede conducir a un sistema general más simple que convertir a y desde binario. La mayoría de las calculadoras de bolsillo hacen todos sus cálculos en BCD.
El mismo argumento se aplica cuando el hardware de este tipo utiliza un microcontrolador integrado u otro procesador pequeño. A menudo, la representación interna de números en formato BCD da como resultado un código más pequeño, ya que una conversión desde o hacia la representación binaria puede ser costosa en procesadores tan limitados. Para estas aplicaciones, algunos procesadores pequeños cuentan con modos aritméticos dedicados, que ayudan a la hora de escribir rutinas que manipulan cantidades BCD. [50] [51]
Existen varias implementaciones de BCD que emplean otras representaciones para los números. Las calculadoras programables fabricadas por Texas Instruments , Hewlett-Packard y otras suelen emplear un formato BCD de punto flotante , normalmente con dos o tres dígitos para el exponente (decimal). Los bits adicionales del dígito del signo se pueden utilizar para indicar valores numéricos especiales, como infinito , desbordamiento por debajo o por encima y error (una pantalla parpadeante).
Los valores decimales con signo se pueden representar de varias maneras. El lenguaje de programación COBOL , por ejemplo, admite cinco formatos decimales con zonas, cada uno de los cuales codifica el signo numérico de una manera diferente:
Tipo | Descripción | Ejemplo |
---|---|---|
No firmado | No hay señal de mordisqueo | F1 F2 F3 |
Seguimiento firmado (formato canónico) | Nibble de signo en el último byte (menos significativo) | F1 F2 C3 |
Firmado en la parte delantera (sobrepunción) | Nibble de signo en el primer byte (el más significativo) | C1 F2 F3 |
Firmado al final por separado | Byte de carácter de signo separado ( '+' o '−' ) después de los bytes de dígitos | F1 F2 F3 2B |
Firmado principal separado | Byte de carácter de signo separado ( '+' o '−' ) que precede a los bytes de dígitos | 2B F1 F2 F3 |
3GPP desarrolló TBCD , [53] una expansión de BCD donde las combinaciones de bits restantes (no utilizadas) se utilizan para agregar caracteres de telefonía específicos, [54] [55] con dígitos similares a los que se encuentran en el diseño original de los teclados telefónicos .
Dígito decimal | Fecha de cierre: 8 4 2 1 |
---|---|
* | 1 0 1 0 |
# | 1 0 1 1 |
a | 1 1 0 0 |
b | 1 1 0 1 |
do | 1 1 1 0 |
Se utiliza como relleno cuando hay un número impar de dígitos. | 1 1 1 1 |
El documento 3GPP mencionado define TBCD-STRING con nibbles intercambiados en cada byte. Bits, octetos y dígitos indexados desde 1, bits desde la derecha, dígitos y octetos desde la izquierda.
bits 8765 del octeto n que codifica el dígito 2 n
bits 4321 del octeto n que codifica el dígito 2( n – 1) + 1
El significado del número 1234
, quedaría 21 43
en TBCD.
Este formato se utiliza en la telefonía móvil moderna para enviar números marcados, así como el ID del operador (la tupla MCC/MNC), IMEI , IMSI (SUPI), etc. [56] [57]
Si los errores en la representación y el cálculo son más importantes que la velocidad de conversión a y desde la pantalla, se puede utilizar una representación binaria escalada, que almacena un número decimal como un entero codificado en binario y un exponente decimal con signo codificado en binario. Por ejemplo, 0,2 se puede representar como 2 × 10-1 .
Esta representación permite multiplicar y dividir rápidamente, pero puede requerir un desplazamiento de una potencia de 10 durante la suma y la resta para alinear los puntos decimales. Es adecuada para aplicaciones con un número fijo de decimales que no requieren este ajuste, en particular aplicaciones financieras en las que 2 o 4 dígitos después del punto decimal suelen ser suficientes. De hecho, se trata casi de una forma de aritmética de punto fijo , ya que la posición del punto de la base está implícita.
Las codificaciones de Hertz y Chen–Ho proporcionan transformaciones booleanas para convertir grupos de tres dígitos codificados en BCD a y desde valores de 10 bits [nb 1] que se pueden codificar de manera eficiente en hardware con solo 2 o 3 retardos de compuerta. El decimal densamente empaquetado (DPD) es un esquema similar [nb 1] que se utiliza para la mayoría de los mantis , excepto el dígito principal, para una de las dos codificaciones decimales alternativas especificadas en el estándar de punto flotante IEEE 754-2008 .
El BIOS de muchas computadoras personales almacena la fecha y la hora en BCD porque el chip de reloj en tiempo real MC6818 utilizado en la placa madre original IBM PC AT proporcionaba la hora codificada en BCD. Este formato se convierte fácilmente a ASCII para su visualización. [58] [59]
Los ordenadores Atari de 8 bits utilizan un formato BCD para los números de coma flotante. El procesador MOS Technology 6502 tiene un modo BCD para las instrucciones de suma y resta. El software suministrado por el fabricante del ordenador portátil Psion Organiser 1 también utiliza BCD para implementar el punto flotante; los modelos posteriores de Psion utilizan exclusivamente el binario.
Los primeros modelos de la PlayStation 3 almacenaban la fecha y la hora en BCD. Esto provocó una interrupción mundial del servicio de la consola el 1 de marzo de 2010. Los dos últimos dígitos del año almacenados en BCD se malinterpretaron como 16, lo que provocó un error en la fecha de la unidad, lo que dejó inoperativas la mayoría de las funciones. Esto se ha denominado el problema del año 2010 .
En el caso Gottschalk v. Benson de 1972 , la Corte Suprema de Estados Unidos revocó la decisión de un tribunal inferior que había permitido una patente para convertir números codificados en BCD a binario en una computadora.
La decisión señaló que una patente "sustituiría totalmente la fórmula matemática y, en la práctica, sería una patente sobre el algoritmo mismo". [60] Esta fue una sentencia histórica que determinó la patentabilidad del software y los algoritmos .
[…] Die nicht erlaubten 0/1-Muster nennt man auch Pseudodezimalen. […](320 páginas)
[…] La última columna [de la Tabla II], etiquetada como "Mejor", da la fracción máxima posible con cualquier código, es decir, 0,60, la mitad mejor que cualquier código convencional. Este extremo se alcanza con los diez vértices fuertemente marcados del gráfico de la Fig. 4 para n = 4, o, de hecho, con cualquier conjunto de diez combinaciones de códigos que incluyan los ocho con un número par (o los ocho con un número impar) de "1". La segunda y tercera filas de la Tabla II enumeran el cambio decimal promedio y máximo por error binario único no detectado, y se han derivado utilizando las ecuaciones de la Sec. II para Δ
1
y δ
1
. El índice de confusión para decimales utilizando el criterio de "cambio decimal", se toma como c
ij
= |i − j| i,j = 0, 1, … 9. Nuevamente, la "Mejor" disposición posible (la misma para promedio y pico), una de las cuales se muestra en la Fig. 4, es sustancialmente mejor que los códigos convencionales. […] Fig. 4 Código de mínima confusión para decimales. […] δ
1
=2 Δ
1
=15 […]
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] (11 páginas) (NB. Además del conjunto combinatorio de "códigos de mínima confusión para decimales" BCD de 4 bits, de los cuales el autor ilustra sólo uno explícitamente (aquí reproducido como código I) en forma de un gráfico de 4 bits, el autor también muestra un "código binario para datos analógicos" de 16 estados y 4 bits en forma de una tabla de códigos, que, sin embargo, no se analiza aquí. El código II que se muestra aquí es una modificación del código I analizado por Berger.)
[…] El código cíclico es ventajoso principalmente en el uso de circuitos de relé, ya que entonces un relé pegajoso no dará un estado falso ya que se retrasa en pasar de un número cíclico al siguiente. Hay muchos otros códigos cíclicos que tienen esta propiedad. […][12] (xxiv+835+1 páginas) (NB. Ledley clasificó el código cíclico descrito como un código binario codificado decimal cíclico ).
[…] Al operar con enteros BCD en
registros de propósito general , los valores BCD se pueden desempaquetar (un dígito BCD por byte) o empaquetar (dos dígitos BCD por byte). El valor de un entero BCD desempaquetado es el valor binario del
medio byte
bajo
(bits 0 a 3). El medio byte alto (bits 4 a 7) puede ser cualquier valor durante la suma y la resta, pero debe ser cero durante la multiplicación y la división. Los enteros BCD empaquetados permiten que dos dígitos BCD estén contenidos en un byte. Aquí, el dígito en el medio byte alto es más significativo que el dígito en el medio byte bajo. […] Cuando se opera con enteros BCD en registros de datos
FPU
x87
, los valores BCD se empaquetan en un formato de 80 bits y se denominan enteros decimales. En este formato, los primeros 9 bytes contienen 18 dígitos BCD, 2 dígitos por byte. El
dígito menos significativo
está contenido en el medio byte inferior del byte 0 y el
dígito más significativo
está contenido en el medio byte superior del byte 9. El bit más significativo del byte 10 contiene el
bit de signo
(0 = positivo y 1 = negativo; los bits 0 a 6 del byte 10 son bits
de no importa
). Los enteros decimales negativos no se almacenan en forma
de complemento a dos
; Se distinguen de los enteros decimales positivos solo por el bit de signo. El rango de enteros decimales que se pueden codificar en este formato es −10
18
+ 1 a 10
18
− 1. El formato de entero decimal existe solo en memoria. Cuando se carga un entero decimal en un registro de datos FPU x87, se convierte automáticamente al
formato de punto flotante de precisión extendida doble
. Todos los enteros decimales se pueden representar exactamente en formato de precisión extendida doble. […]
[13]