Decimal codificado en binario
En sistemas informáticos y electrónicos, decimal codificado en binario (BCD) es una clase de codificaciones binarias de números decimales donde cada dígito está representado por un número fijo de bits, generalmente 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 desempaquetado generalmente implica un byte completo para cada dígito (a menudo incluye un signo), mientras que empaquetado BCD 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 4 bits puede variar por razones técnicas (por ejemplo, Excess-3).
Los diez estados que representan un dígito BCD a veces se denominan tetrades (porque el mordisco que normalmente se necesita para contenerlos es también conocida como tétrada), mientras que los estados no utilizados, no importa, se denominan pseudo-tétrada(e)s
, pseudodecimales o pseudodecimales.La principal virtud de BCD, en comparación con los sistemas posicionales binarios, es su representación más precisa y el redondeo de cantidades decimales, así como su facilidad de conversión a representaciones convencionales legibles por humanos. Sus principales inconvenientes 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.
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, la VAX de Digital Equipment Corporation, la Burroughs B1700 y la Motorola 68000. -procesadores de la serie. BCD per se no se usa tanto como en el pasado y no está disponible o está limitado en conjuntos de instrucciones más nuevos (por ejemplo, ARM; x86 en modo largo). Sin embargo, los formatos decimales de coma fija y decimal de coma flotante siguen siendo importantes y se siguen utilizando en la informática financiera, comercial e industrial, donde no se pueden tolerar los sutiles errores de conversión y redondeo fraccionario que son inherentes a los formatos binarios de coma flotante.
Antecedentes
BCD aprovecha el hecho de que cualquier número decimal puede representarse mediante un patrón de cuatro bits. La forma más obvia de codificar dígitos es BCD natural (NBCD), donde cada dígito decimal está representado por su correspondiente valor binario de cuatro bits, como se muestra en la siguiente tabla. Esto también se llama "8421" codificación
Digito 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 |
This scheme can also be referred to Decimal binario simple ()SBCD) o BCD 8421, y es la codificación más común. Otros incluyen la llamada codificación "4221" y "7421" (nombrada después del peso utilizado para los bits) y "Exceso-3". Por ejemplo, el dígito BCD 6, 0110'b
en 8421 notación, es 1100'b
en 4221 (dos codificacións son posibles), 0110'b
en 7421, mientras que en Excess-3 es 1001'b
()6+3=9{displaystyle 6+3=9}).
Bit | 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 (XS-0) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||
7 4 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
Aiken (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
Exceso-3 (XS-3) | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ||
Exceso-6 (XS-6) | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||
Salto a 2 (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
Salto al 8 (2 4 2 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
4 2 2 1 (I) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
4 2 2 1 (II) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
5 4 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
5 2 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
5 1 2 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
5 3 1 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
Blanco (5 2 1 1) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
5 2 1 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
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 | ||||||||
Paul | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 0 | 8 | 9 | ||||||||
Gray | 0 | 1 | 3 | 2 | 7 | 6 | 4 | 5 | 15 | 14 | 12 | 13 | 8 | 9 | 11 | 10 | ||
Glixon | 0 | 1 | 3 | 2 | 6 | 7 | 5 | 4 | 9 | 8 | ||||||||
Ledley | 0 | 1 | 3 | 2 | 7 | 6 | 4 | 5 | 8 | 9 | ||||||||
4 3 1 1 1 | 0 | 1 | 2 | 3 | 5 | 4 | 6 | 7 | 8 | 9 | ||||||||
LARC | 0 | 1 | 2 | 4 | 3 | 5 | 6 | 7 | 9 | 8 | ||||||||
Klar | 0 | 1 | 2 | 4 | 3 | 9 | 8 | 7 | 5 | 6 | ||||||||
Petherick (RAE) | 1 | 3 | 2 | 0 | 4 | 8 | 6 | 7 | 9 | 5 | ||||||||
O'Brien I (Watts) | 0 | 1 | 3 | 2 | 4 | 9 | 8 | 6 | 7 | 5 | ||||||||
5 ciclos | 0 | 1 | 3 | 2 | 4 | 5 | 6 | 8 | 7 | 9 | ||||||||
Tompkins I | 0 | 1 | 3 | 2 | 4 | 9 | 8 | 7 | 5 | 6 | ||||||||
Lippel | 0 | 1 | 2 | 3 | 4 | 9 | 8 | 7 | 6 | 5 | ||||||||
O'Brien II | 0 | 2 | 1 | 4 | 3 | 9 | 7 | 8 | 5 | 6 | ||||||||
Tompkins II | 0 | 1 | 4 | 3 | 2 | 7 | 9 | 8 | 5 | 6 | ||||||||
Exceso-3 Gray | -3 | -2 | 0 | -1 | 4 | 3 | 1 | 2 | 12 | 11 | 9 | 10 | 5 | 6 | 8 | 7 | ||
6 3 – 2 – 1 (I) | 3 | 2 | 1 | 0 | 5 | 4 | 8 | 9 | 7 | 6 | ||||||||
6 3 – 2 – 1 (II) | 0 | 3 | 2 | 1 | 6 | 5 | 4 | 9 | 8 | 7 | ||||||||
8 4 – 2 – 1 | 0 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 9 | ||||||||
Lucal | 0 | 15 | 14 | 1 | 12 | 3 | 2 | 13 | 8 | 7 | 6 | 9 | 4 | 11 | 10 | 5 | ||
Kautz I | 0 | 2 | 5 | 1 | 3 | 7 | 9 | 8 | 6 | 4 | ||||||||
Kautz II | 9 | 4 | 1 | 3 | 2 | 8 | 6 | 7 | 0 | 5 | ||||||||
Susskind I | 0 | 1 | 4 | 3 | 2 | 9 | 8 | 5 | 6 | 7 | ||||||||
Susskind II | 0 | 1 | 9 | 8 | 4 | 3 | 2 | 5 | 6 | 7 | ||||||||
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 "8 4 2 1
" 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 dividido en zonas.
Digit | BCD 8421 | Código Stibitz o Excess-3 | Aiken-Code o BCD 2421 | BCD 84−2−1 | IBM 702, IBM 705, IBM 7080, IBM 1401 8421 | ASCII 0000 8421 | EBCDIC 0000 8421 |
---|---|---|---|---|---|---|---|
0 | 0000 | 0011 | 0000 | 0000 | Graben 19, 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 | Graben 19, 1010 | 0110 | 0011 0110 | 1111 0110 |
7 | 0111 | Graben 19, 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 usar uno de los siguientes métodos para codificar un número BCD:
- Desempaquetado: Cada dígito decimal se codifica en un byte, con cuatro bits que representan el número y los bits restantes no tienen importancia.
- Empaquetado: Dos dígitos decimales se codifican en un solo byte, con un dígito en la nibble menos significativa (bitos 0 a 3) y el otro numeral en la nibble más significativa (bits 4 a 7).
Como ejemplo, codificar el número decimal 91
utilizando BCD desempaquetado da como resultado el siguiente patrón binario de dos bytes:
Decimal: 9 1 binario: 0000 1001 0000 0001
En BCD empaquetado, el mismo número cabría en un solo byte:
Decimal: 9 1 binario: 1001 0001
Por lo tanto, el rango numérico para un byte BCD desempaquetado 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 más grandes que el rango de un solo byte, se puede usar cualquier número de bytes contiguos. Por ejemplo, para representar el número decimal 12345
en formato BCD empaquetado, utilizando el formato big-endian, un programa codificaría de la siguiente manera:
Decimal: 0 1 2 3 4 5 binario: 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 formateo pueden reemplazar o eliminar ceros). El BCD empaquetado es más eficiente en el uso del almacenamiento que el BCD sin empaquetar; 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 empaquetar o desempaquetar un dígito BCD empaquetado. Se utilizan otras operaciones bit a bit para convertir un número a su patrón de bits equivalente o invertir el proceso.
BCD empaquetado
En BCD empaquetado (o simplemente decimal empaquetado), cada uno de los dos nibbles de cada byte representa un dígito decimal. Packed BCD ha estado en uso desde al menos la década de 1960 y se implementa 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 generalmente se usa como indicador de signo, aunque algunas representaciones sin signo carecen de un indicador de signo. Como ejemplo, un valor de 4 bytes consta de 8 nibbles, donde los 7 nibbles superiores almacenan los dígitos de un valor decimal de 7 dígitos, y el nibble más bajo indica el signo del valor entero decimal.
Los valores de signo estándar son 1100 (C hexadecimal) para positivo (+) y 1101 (D) para negativo (−). Esta convención proviene del campo de zona para caracteres EBCDIC y la representación de sobreperforación firmada. 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á configurado 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). ILE RPG usa 1111 (F) para positivo y 1101 (D) para negativo. Éstos coinciden con la zona EBCDIC para los dígitos sin un signo de superposición. En BCD empaquetado, el número 127 está representado por 0001 0010 0111 1100 (127C) y −127 está representado por 0001 0010 0111 1101 (127D). Los sistemas de Burroughs utilizaron 1101 (D) para negativo, y cualquier otro valor se considera un valor de signo positivo (los procesadores normalizarán un signo positivo a 1100 (C)).
Signatura dígito | BCD 8 4 2 1 | Signatura | Notas |
---|---|---|---|
A | 1 0 1 0 | + | |
B | 1 0 1 1 1 | − | |
C | 1 0 0 | + | Preferencias |
D | 1 1 0 1 | − | Preferencias |
E | 1 1 1 1 0 | + | |
F | 1 1 1 1 1 | + | No asignados |
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 (2n)−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 1101 1 2 3 4 5 6 7 −
Al igual que las cadenas de caracteres, el primer byte del decimal empaquetado, el que tiene los dos dígitos más significativos, generalmente se almacena en la dirección más baja de la memoria, independientemente de la configuración endian 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 (usando 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 hace trivial, ya que no hay operaciones aritméticas. son requeridos. Los requisitos de almacenamiento adicional generalmente se compensan con la necesidad de precisión y compatibilidad con la calculadora o el cálculo manual que proporciona la aritmética decimal de punto fijo. Existen empaques más densos de BCD que evitan la penalización por almacenamiento y tampoco necesitan operaciones aritméticas para conversiones comunes.
BCD empaquetado es compatible con el lenguaje de programación COBOL como "COMPUTATIONAL-3" (una extensión de IBM adoptada por muchos otros proveedores de compiladores) o "PACKED-DECIMAL" (parte del estándar COBOL de 1985) tipo de datos. Se admite en PL/I como "DECIMAL FIJO". Además de IBM System/360 y mainframes compatibles posteriores, BCD empaquetado se implementa en el conjunto de instrucciones nativas de los procesadores VAX originales de Digital Equipment Corporation y algunos modelos de mainframes de la serie SDS Sigma, y es el formato nativo para los sistemas medianos de Burroughs Corporation línea de mainframes (descendientes de la serie Electrodata 200 de la década de 1950).
Las representaciones en complemento de 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 (ambos inclusive), mientras que los números negativos están representados por 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 en complemento a dos, el rango no es simétrico con respecto a cero.)
Decimal empaquetado de punto fijo
Los números decimales de punto fijo son compatibles con algunos lenguajes de programación (como COBOL y PL/I). 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 +1234,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 en realidad no se almacena en la memoria, ya que el formato de almacenamiento BCD empaquetado no lo proporciona. El compilador simplemente conoce su ubicación y el código generado actúa en consecuencia para las diversas operaciones aritméticas.
Codificaciones de mayor densidad
Si un dígito decimal requiere cuatro bits, entonces tres dígitos decimales requieren 12 bits. Sin embargo, dado que 210 (1024) es mayor que 103 (1000), si se codifican tres dígitos decimales juntos, solo se necesitan 10 bits. Dos de estas codificaciones son codificación Chen-Ho y decimal densamente empaquetado (DPD). Este último 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 BCD normal.
Decimal dividido en zonas
Algunas implementaciones, por ejemplo, los sistemas mainframe de IBM, admiten representaciones numéricas decimales divididos en zonas. Cada dígito decimal se almacena en un byte, con los cuatro bits inferiores codificando el dígito en formato BCD. Los cuatro bits superiores, llamados "zona" bits, generalmente se establecen en 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" hasta "9". De manera similar, los sistemas ASCII utilizan un valor de zona de 0011 (hexadecimal 3), dando códigos de caracteres del 30 al 39 (hexadecimal).
Para los valores decimales divididos en zonas con signo, el nibble de 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 dividido en zonas codificado como bytes hexadecimales F1 F2 D3 representa el valor decimal con signo −123:
F1 F2 D3 1 2 - 3
Tabla de conversión decimal zonificada EBCDIC
Dígito BCD | Hexadecimal | EBCDIC character | ||||||
---|---|---|---|---|---|---|---|---|
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 | C | t | T | 3 |
4+ | C4 | A4 | E4 | F4 | D | u | U | 4 |
5+ | C5 | A5 | E5 | F5 | E | v | V | 5 |
6+ | C6 | A6 | E6 | F6 | F | w | W | 6 |
7+ | C7 | A7 | E7 | F7 | G | x | X | 7 |
8+ | C8 | A8 | E8 | F8 | H | Sí. | Y | 8 |
9+ | C9 | A9 | E9 | F9 | I | z | Z | 9 |
0 - | D0 | B0 | } (*) | ^ (*) | ||||
1 - 1 | D1 | B1 | J | |||||
2 - 2 | D2 | B2 | K | |||||
3 - 3 | D3 | B3 | L | |||||
4- | D4 | B4 | M | |||||
5 - | D5 | B5 | N | |||||
6 a | D6 | B6 | O | |||||
7 - | D7 | B7 | P | |||||
8 a 8 | D8 | B8 | Q | |||||
9 a | D9 | B9 | R |
(*) Nota: estos caracteres varían según la configuración de la página de códigos de caracteres local.
Decimal con zona de punto fijo
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 dividido en zonas 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 C0 1 2 7 9. 5 +0
BCD en ordenadores
IBM
IBM utilizó los términos Código de intercambio decimal codificado en binario (BCDIC, a veces simplemente llamado BCD), para códigos alfanuméricos de 6 bits que representaban números, letras mayúsculas y caracteres especiales. Algunas variaciones de BCDIC alphamerics se utilizan en la mayoría de las primeras computadoras IBM, incluida la IBM 1620 (introducida en 1959), la serie IBM 1400 y los miembros de arquitectura no decimal de la serie IBM 700/7000.
La serie IBM 1400 son máquinas direccionables por caracteres, cada ubicación tiene seis bits etiquetados como B, A, 8, 4, 2 y 1, más una verificación de paridad impar bit (C) y un bit de marca de palabra (M). Para codificar dígitos 1 a 9, B y A son cero y el valor del dígito representado por el estándar de 4 bits BCD en bits 8 a 1. Para la mayoría de los demás caracteres, los bits B y A se derivan simplemente de "12", "11" y " 0" "golpes de zona" en el código de carácter de la tarjeta perforada, y los bits 8 a 1 de las perforaciones 1 a 9. Una "12 zona" conjunto de punzones tanto B como A, una "11 zona" establece B, y una "0 zona" (un golpe 0 combinado con cualquier otro) establecer A. Así, la letra A, que es (12,1) en el formato de tarjeta perforada, se codifica como (B,A,1). El símbolo de moneda $, (11,8,3) en la tarjeta perforada, fue codificado en memoria como (B,8,2,1). Esto permite que la conversión de circuitos entre el formato de tarjeta perforada y el formato de almacenamiento interno sea muy simple con solo unos pocos casos especiales. Un caso especial importante es el dígito 0, representado por un único 0 perforado en la tarjeta y (8,2) en la memoria central.
La memoria del IBM 1620 está organizada en dígitos direccionables de 6 bits, los habituales 8, 4, 2, 1 más F, utilizados como bit indicador y C, un bit de verificación de paridad impar. Los alfaméricos de BCD se codifican mediante pares de dígitos, con la "zona" en el dígito con dirección par y el "dígito" en el dígito impar, la "zona" está relacionado con los 12, 11 y 0 "golpes de zona" 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 de 6 bits estándar externos.
En la Arquitectura Decimal, IBM 7070, IBM 7072 e IBM 7074 alfaméricos se codifican usando pares de dígitos (usando dos de cinco códigos en los dígitos, no BCD) de la palabra de 10 dígitos, con la "zona" en el dígito de la izquierda 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 de 6 bits estándar externos.
Con la introducción de System/360, IBM amplió los alfaméricos BCD de 6 bits a EBCDIC de 8 bits, lo que permite agregar muchos más caracteres (por ejemplo, letras minúsculas). También se implementa un tipo de datos numérico BCD empaquetado 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 paquete de subrutina comercial de IBM admite BCD empaquetado en el software.
Hoy en día, los datos BCD todavía se usan mucho en los procesadores y bases de datos de IBM, como IBM Db2, mainframes y Power6. En estos productos, el BCD suele dividirse en zonas BCD (como en EBCDIC o ASCII), BCD empaquetado (dos dígitos decimales por byte) o "puro" Codificación BCD (un dígito decimal almacenado como BCD en los cuatro bits inferiores de cada byte). Todos estos se utilizan dentro de los registros de hardware y las unidades de procesamiento, y en el software. Para convertir decimales empaquetados en descargas de tablas EBCDIC en números legibles, puede utilizar la máscara OUTREC FIELDS de la utilidad JCL DFSORT.
Otras computadoras
La serie VAX-11 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 enteros. El formato BCD empaquetado de VAX es compatible con el de IBM System/360 y los procesadores compatibles posteriores de IBM. Las implementaciones de MicroVAX y VAX posteriores eliminaron esta capacidad de la CPU, pero mantuvieron la compatibilidad del 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 usan puedan ejecutarse sin modificaciones en las máquinas más nuevas.
La arquitectura Intel x86 admite un formato BCD único de 18 dígitos (diez bytes) que se puede cargar y almacenar desde los registros de coma flotante, desde donde se pueden realizar los cálculos.
La serie Motorola 68000 tenía instrucciones BCD.
En las computadoras más recientes, estas capacidades casi siempre se implementan en el software en lugar del conjunto de instrucciones de la CPU, pero los datos numéricos BCD siguen siendo extremadamente comunes en las aplicaciones comerciales y financieras. Hay trucos para implementar BCD empaquetado y operaciones de suma o resta de decimales divididos en zonas utilizando secuencias cortas pero difíciles de entender de lógica de palabras paralelas y operaciones aritméticas binarias. Por ejemplo, el siguiente código (escrito en C) calcula una suma BCD empaquetada de 8 dígitos sin signo mediante operaciones binarias de 32 bits:
uint32_t BCDadd()uint32_t a, uint32_t b){} uint32_t t1, t2; // valores intermedios no asignados de 32 bits t1 = a + 0x06666666; t2 = t1 ^ b; // suma sin propagación t1 = t1 + b; // Suma provisional t2 = t1 ^ t2; // todos los bits de carga binaria t2 = ~t2 " 0x1111111110; // sólo el BCD lleva bits t2 = ()t2 > 2) Silencio ()t2 > 3); // corrección retorno t1 - t2; // corrección de la suma BCD}
BCD en electrónica
BCD es muy 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. Mediante el empleo de 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 único subcircuito separado. 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 de siete segmentos idénticas e independientes para construir un circuito de medición, por ejemplo. Si la cantidad numérica se almacenara y manipulara como binario puro, la interfaz con tal pantalla requeriría un circuito complejo. 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 la conversión 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, representar números internamente en formato BCD da como resultado un código más pequeño, ya que una conversión desde o hacia una 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 al escribir rutinas que manipulan cantidades BCD.
Operaciones con BCD
Adición
Es posible realizar sumas 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 sumar 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 24 = 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 como en decimal, no puede existir un valor mayor a 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 = título 0001 0111 17 + 6 = 23 1 7
Los dos nibbles del resultado, 0001 y 0111, corresponden a los dígitos "1" y "7". Esto produce "17" en BCD, que es el resultado correcto.
Esta técnica se puede ampliar para sumar varios dígitos sumando en grupos de derecha a izquierda, propagando el segundo dígito como un acarreo, siempre comparando el resultado de 5 bits de cada suma de pares de dígitos con 9. Algunas CPU proporcionan un medio -carry flag para facilitar los ajustes aritméticos de BCD después de operaciones binarias de suma y resta. Intel 8080, Zilog Z80 y las CPU de la familia x86 proporcionan el código de operación DAA (acumulador de ajuste decimal).
Sustracción
La resta se realiza sumando el complemento de decenas del sustraendo al minuendo. Para representar el signo de un número en BCD, el número 0000 se usa para representar un número positivo y el 1001 se usa para representar un número negativo. Las 14 combinaciones restantes son signos inválidos. Para ilustrar la resta BCD con signo, considera el siguiente problema: 357 − 432.
En BCD con signo, 357 es 0000 0011 0101 0111. El complemento de diez de 432 se puede obtener tomando el complemento de nueve de 432 y luego sumando uno. Entonces, 999 − 432 = 567 y 567 + 1 = 568. Precediendo a 568 en BCD con el código de signo negativo, se puede representar el número −432. Entonces, −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 el caso de que exista una entrada no válida (cualquier dígito BCD mayor que 1001), se agrega 6 para generar un bit de acarreo y hacer que la suma se convierta en una entrada válida. Entonces, agregar 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, tenga en cuenta 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 de diez de 925 es 1000 − 925 = 75, por lo que la respuesta calculada es −75.
Si hay una cantidad diferente de nibbles que se están sumando (como 1053 − 2), el número con menos dígitos primero debe anteponerse con ceros antes de tomar el complemento de decenas o restar. Entonces, con 1053 − 2, 2 primero tendría que representarse como 0002 en BCD, y tendría que calcularse el complemento de decenas de 0002.
Comparación con binario puro
Ventajas
- Muchos valores no integrados, como decimal 0.2, tienen una representación infinita de valor de lugar en binario (.001100110011...) pero tienen un valor de lugar finito en decimal codificado binario (0.0010). En consecuencia, un sistema basado en representaciones decimales codificadas binariamente de fracciones decimales evita errores que representan y calculan tales valores. Esto es útil en cálculos financieros.
- Escalar por un poder de 10 es simple.
- Redondear en un límite decimal dígito es más simple. La adición y la resta en decimal no requieren redondeo.
- La alineación de dos números decimales (por ejemplo 1.3 + 27.08) es un cambio simple y exacto.
- La conversión a un formulario de caracteres o para la visualización (por ejemplo, a un formato basado en texto como XML, o para impulsar señales para una pantalla de siete segmentos) es una simple asignación de per dígitos, y se puede hacer en lineal (O(n) tiempo. La conversión de binario puro implica lógica relativamente compleja que abarca dígitos, y para grandes números, no se conoce ningún algoritmo de conversión de tiempo lineal (ver sistema de numeral binario § Conversión a y de otros sistemas numerales).
Desventajas
- Algunas operaciones son más complejas para implementarlas. Los aditivos requieren lógica adicional para hacer que envuelvan y generen un port temprano. Se necesitan entre un 15% y un 20% más de circuitos para que el CDB agregue binario puro. Multiplicación requiere el uso de algoritmos que son algo más complejos que el cambio-mask-add (una multiplicación binaria, que requiere cambios y adiciones binarias o el equivalente, per-digit o grupo de dígitos es requerido).
- BCD estándar requiere cuatro bits por dígito, aproximadamente un 20% más espacio que una codificación binaria (la proporción de 4 bits a log210 bits es 1.204). Cuando se empaquetan para que tres dígitos estén codificados en diez bits, la sobrecarga de almacenamiento se reduce considerablemente, a expensas de una codificación que no se conoce con los límites de byte de 8 bits comunes en el hardware existente, lo que resulta en implementaciones más lentas en estos sistemas.
- Las implementaciones prácticas existentes de BCD suelen ser más lentas que las operaciones en representaciones binarias, especialmente en sistemas integrados, debido a un apoyo limitado de procesadores para operaciones nativas de BCD.
Variaciones de representación
Existen varias implementaciones de BCD que emplean otras representaciones de números. Las calculadoras programables fabricadas por Texas Instruments, Hewlett-Packard y otros 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 de signo se pueden usar para indicar valores numéricos especiales, como infinito, subdesbordamiento/desbordamiento y error (una pantalla parpadeante).
Variaciones firmadas
Los valores decimales con signo se pueden representar de varias formas. El lenguaje de programación COBOL, por ejemplo, admite cinco formatos decimales divididos en zonas, cada uno de los cuales codifica el signo numérico de una manera diferente:
Tipo | Descripción | Ejemplo |
---|---|---|
No asignados | No hay señal nibble | F1 F2 F3 |
Señalización (formato canónico) | Firme nibble en el último byte (menos significativo) | F1 F2 C3 |
Signed leading (sobrepunch) | Sign nibble in the first (most significant) byte | C1 F2 F3 |
Signed trailing separate | Separar el carácter de signo byte ('+' o '−' ) siguiendo los bytes dígitos
| F1 F2 F3 2B |
Signed leading separate | Separar el carácter de signo byte ('+' o '−' ) anterior a los bytes dígitos
| 2B F1 F2 F3 |
Decimal codificado en binario de telefonía (TBCD)
3GPP desarrolló TBCD, una expansión de BCD donde las combinaciones de bits restantes (no utilizadas) se utilizan para agregar caracteres telefónicos específicos, con dígitos similares a los que se encuentran en el diseño original de los teclados telefónicos.
Decimal dígito | TBCD 8 4 2 1 |
---|---|
* | 1 0 1 0 |
# | 1 0 1 1 1 |
a | 1 0 0 |
b | 1 1 0 1 |
c | 1 1 1 1 0 |
Se utiliza como llenador cuando hay un número impar de dígitos | 1 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 de octeto n dígito de codificación 2n
bits 4321 de octeto n dígito de codificación 2(n – 1) + 1
Significado de número 1234
, se convertiría en 21 43
en TBCD.
Codificaciones alternativas
Si los errores en la representación y el cálculo son más importantes que la velocidad de conversión hacia y desde la pantalla, se puede usar 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 multiplicaciones y divisiones rápidas, pero puede requerir un cambio de potencia de 10 durante la suma y la resta para alinear los puntos decimales. Es apropiado para aplicaciones con un número fijo de decimales que luego no requieren este ajuste, particularmente aplicaciones financieras donde 2 o 4 dígitos después del punto decimal suelen ser suficientes. De hecho, esto es casi una forma de aritmética de punto fijo ya que la posición del punto base está implícita.
Las codificaciones Hertz y Chen-Ho proporcionan transformaciones booleanas para convertir grupos de tres dígitos codificados en BCD hacia y desde valores de 10 bits que se pueden codificar de manera eficiente en hardware con solo 2 o 3 retardos de puerta. Densely Packed Decimal (DPD) es un esquema similar que se utiliza para la mayor parte de la mantisa, excepto el dígito inicial, para una de las dos codificaciones decimales alternativas especificadas en el estándar de punto flotante IEEE 754-2008.
Solicitud
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 base IBM PC AT original proporcionó la hora codificada en BCD. Este formulario se convierte fácilmente a ASCII para su visualización.
La familia de computadoras Atari de 8 bits usaba BCD para implementar algoritmos de punto flotante. El procesador MOS 6502 tiene un modo BCD que afecta las instrucciones de suma y resta. El software proporcionado por el fabricante de la computadora de mano Psion Organizer 1 también usó completamente BCD para implementar el punto flotante; Los modelos posteriores de Psion usaban binario exclusivamente.
Los primeros modelos de PlayStation 3 almacenan la fecha y la hora en BCD. Esto provocó una interrupción mundial de la consola el 1 de marzo de 2010. Los dos últimos dígitos del año almacenados como BCD se malinterpretaron como 16, lo que provocó un error en la fecha de la unidad, lo que hizo que la mayoría de las funciones no funcionaran. Esto se ha denominado el problema del año 2010.
Historial jurídico
En el caso de 1972 Gottschalk v. Benson, la Corte Suprema de EE. UU. anuló la decisión de un tribunal inferior que había permitido una patente para convertir números codificados en BCD a binarios en una computadora. La decisión señaló que una patente "se adelantaría por completo a la fórmula matemática y, en la práctica, sería una patente sobre el algoritmo en sí". Este fue un juicio histórico que determinó la patentabilidad del software y los algoritmos.
Contenido relacionado
Algoritmo de búsqueda binaria
IEEE 802.2
En línea y fuera de línea