Decimal codificado en binario - Binary-coded decimal

Un reloj binario puede usar LED para expresar valores binarios. En este reloj, cada columna de LED muestra un número decimal codificado en binario del tiempo sexagesimal tradicional .

En los sistemas informáticos y electrónicos , el 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 el BCD empaquetado generalmente codifica dos dígitos dentro de un solo byte aprovechando el hecho de que cuatro los 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, Exceso-3 ).

Los diez estados que representan un dígito BCD a veces se denominan tétradas (porque el mordisco que normalmente se necesita para mantenerlos también se conoce como tétrada), mientras que los estados no utilizados, no importa, se denominan pseudo-tétrada (e) s  [ de ] , pseudo-decimales o pseudo-dígitos decimales .

La principal virtud de 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 en 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 utiliza en muchos de los primeros ordenadores decimales , y se implementa en el conjunto de instrucciones de las máquinas, como el IBM System / 360 series y sus descendientes, Digital Equipment Corporation 's VAX , el Burroughs B1700 , y el Motorola 68000 procesadores -series. BCD per se no se usa tan ampliamente como en el pasado y ya no se implementa en conjuntos de instrucciones de computadoras más nuevas (por ejemplo, ARM ); x86 ya no admite sus instrucciones BCD en modo largo . Sin embargo, los formatos decimales de coma fija y coma flotante siguen siendo importantes y continúan utilizándose en la informática financiera, comercial e industrial, donde la conversión sutil y los errores de redondeo fraccionario que son inherentes a las representaciones binarias de coma flotante no pueden tolerarse.

Fondo

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 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 en binario simple ( SBCD ) o BCD 8421 , y es la codificación más común. Otros incluyen la codificación denominada "4221" y "7421", denominada así por la ponderación utilizada para los bits, y " Exceso-3 ". Por ejemplo, el dígito 6 de BCD, 0110'ben notación 8421, está 1100'ben 4221 (son posibles dos codificaciones), 0110'ben 7421, mientras que en Exceso-3 es 1001'b( ).

Códigos BCD de 4 bits y pseudo-tétradas
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 (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
Saltar en 2 (2 4 2 1) 0 1             2 3 4 5 6 7 8 9
Saltar en 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          
Pablo   1 3 2 6 7 5 4   0     8 9    
gris 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 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 (vatios) 0 1 3 2     4   9 8 6 7     5  
5-cíclico 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 Gris -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 yo   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 dígitos decimales del 0 al 9 en varios sistemas de codificación BCD. En los encabezados, " " 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 por zonas. 8421

 
Dígito
BCD
8 4 2 1
 Código Stibitz o Exceso-3 Código Aiken o BCD
2 4 2 1
BCD
8 4 −2 −1
IBM 702 , IBM 705 , IBM 7080 , IBM 1401 8421
ASCII
0000 8421
EBCDIC
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:

  • 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 : Se codifican dos dígitos decimales en un solo byte, con un dígito en el nibble menos significativo ( bits 0 a 3 ) y el otro número en el nibble más significativo (bits 4 a 7).

Como ejemplo, la codificación del número decimal 91utilizando BCD desempaquetado da como resultado el siguiente patrón binario de dos bytes:

Decimal:         9         1
Binary : 0000 1001 0000 0001

En BCD empaquetado, el mismo número cabría en un solo byte:

Decimal:   9    1
Binary: 1001 0001

Por lo tanto, el rango numérico para un byte BCD sin empaquetar 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 usar cualquier número de bytes contiguos. Por ejemplo, para representar el número decimal 12345en BCD empaquetado, utilizando el formato big-endian , un programa codificaría de la siguiente manera:

Decimal:    0    1    2    3    4    5
Binary : 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). BCD empaquetado es más eficiente en el uso de almacenamiento que BCD sin empaquetar; codificar el mismo número (con el cero a la izquierda) en formato descomprimido consumiría el doble de almacenamiento.

Las operaciones de cambio y enmascaramiento se utilizan para empaquetar o desempacar un dígito BCD empaquetado. Otras operaciones bit a bit se utilizan para convertir un número en su patrón de bit 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. El BCD empaquetado ha estado en uso desde al menos 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 usa generalmente como bandera de signo, aunque algunas representaciones sin firmar carecen de una bandera 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 ( 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 overpunch firmada . Otros signos permitidos son 1010 (A) y 1110 (E) para positivo y 1011 (B) para negativo. Los procesadores IBM System / 360 usará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 firmar con un nibble de signo de 1111 (F). ILE RPG usa 1111 (F) para positivo y 1101 (D) para negativo. Estos coinciden con la zona EBCDIC para los dígitos sin un sobrepicado de signo. 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 Burroughs usaron 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)).


Dígito de signo
BCD
8 4 2 1
Firmar Notas
A 1 0 1 0 +  
B 1 0 1 1 -  
C 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 requiere1/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 está codificado 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 del endianness de la máquina.

Por el contrario, un entero de complemento a dos binario de 4 bytes puede representar valores de −2,147,483,648 a +2,147,483,647.

Si bien 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 se requieren operaciones aritméticas. Los requisitos de almacenamiento adicionales 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 coma fija. Existen empaquetamientos más densos de BCD que evitan la penalización por almacenamiento y tampoco necesitan operaciones aritméticas para 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 "DECIMAL FIJO". Además de IBM System / 360 y mainframes compatibles posteriores, el 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 de Burroughs Corporation Medium Systems línea de mainframes (descendiente 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 (inclusive), mientras que los números negativos están representados por el complemento de 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 coma fija son compatibles con algunos lenguajes de programación (como COBOL, PL / I y Ada ). 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 los dígitos 4 y 5:

12 34 56 7C
12 34.56 7+

El punto decimal no se almacena realmente en la memoria, ya que el formato de almacenamiento BCD empaquetado no lo permite. Su ubicación es simplemente conocida por el compilador 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, tres dígitos decimales requieren 12 bits. Sin embargo, dado que 2 10 (1,024) es mayor que 10 3 (1,000), 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 decimal densamente empaquetada (DPD). Este último tiene la ventaja de que los subconjuntos de codificación codifican dos dígitos en los siete bits óptimos y un dígito en cuatro bits, como en BCD normal.

Decimal zonificado

Algunas implementaciones, por ejemplo, los sistemas mainframe de IBM , admiten representaciones numéricas decimales divididas en zonas . Cada dígito decimal se almacena en un byte, y los cuatro bits inferiores codifican el dígito en forma BCD. Los cuatro bits superiores, llamados bits de "zona", 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 (F hexadecimal); esto produce bytes en el rango de F0 a F9 (hexadecimal), que son los códigos EBCDIC para los caracteres "0" a "9". De manera similar, los sistemas ASCII usan un valor de zona de 0011 (hex 3), dando códigos de caracteres 30 a 39 (hex).

Para los valores decimales con signo, el nibble de la zona más a la derecha (el menos significativo) contiene el dígito de signo, que es el mismo conjunto de valores que se utilizan para los números decimales empaquetados con signo (ver más arriba). Por lo tanto, un valor decimal dividido en zonas codificado como los bytes hexadecimales F1 F2 D3 representa el valor decimal con signo −123:

F1 F2 D3
1  2 −3

Tabla de conversión decimal con zonas EBCDIC

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 C t T 3
4+ C4 A4 E4 F4 D tu U 4
5+ C5 A5 E5 F5 mi v V 5
6+ C6 A6 E6 F6 F w W 6
7+ C7 A7 E7 F7 GRAMO X X 7
8+ C8 A8 E8 F8 H y Y 8
9+ C9 A9 E9 F9 I z Z 9
0− D0 B0     } (*) ^ (*)    
1− D1 B1     J      
2− D2 B2     K      
3− D3 B3     L      
4− D4 B4     METRO      
5− D5 B5     norte      
6− D6 B6     O      
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 local .

Decimal con zona de coma fija

Algunos idiomas (como COBOL y PL / I) admiten directamente valores decimales con zona de coma fija, asignando una coma decimal implícita en alguna ubicación entre los dígitos decimales de un número. Por ejemplo, dado un valor decimal zonificado de seis bytes con signo y un punto decimal implícito a la derecha del cuarto dígito, los bytes hexadecimales F1 F2 F7 F9 F5 C0 representan el valor +1 279,50:

F1 F2 F7 F9 F5 C0
1  2  7  9. 5 +0

BCD en computadoras

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. Alguna variación de BCDIC alphamerics se utiliza en la mayoría de las primeras computadoras de IBM, incluyendo el IBM 1620 (presentado en 1959), Serie 1400 de IBM , y no decimal Arquitectura miembros de las series 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 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 está representado por el BCD estándar de 4 bits en los bits del 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 carácter de la tarjeta perforada , y los bits 8 a 1 de las perforaciones 1 a 9 . Un punzón "12 zona" set tanto B y A , un "11 zona" conjunto B , y un "0 zona" (a 0 punzón combinado con cualquier otro) conjunto A . Así, la letra A , que es (12,1) en el formato de tarjeta perforada, está codificada (B, A, 1) . El símbolo de moneda $ , (11,8,3) en la tarjeta perforada, se codificó en la memoria como (B, 8,2,1) . Esto permite que el circuito para convertir 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 solo 0 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 , que se utilizan como bit de bandera y C , un bit de verificación de paridad impar. Las letras alfabéticas 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 con dirección impar, estando la "zona" relacionada con las "perforaciones 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 estándar externos de 6 bits.

En el decimal Arquitectura IBM 7070 , IBM 7072 , y IBM 7074 alphamerics se codifican utilizando pares de dígitos (utilizando de dos fuera de cinco código 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 estándar externos de 6 bits.

Con la introducción de System / 360 , IBM amplió las letras alfabéticas BCD de 6 bits a EBCDIC de 8 bits, lo que permitió la adició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 es compatible con el software del paquete de subrutinas comerciales de IBM.

Hoy en día, los datos BCD todavía se utilizan mucho en procesadores y bases de datos de IBM , como IBM DB2 , mainframes y Power6 . En estos productos, el BCD suele ser BCD dividido en zonas (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. Para convertir decimales empaquetados en descargas de tablas EBCDIC en números legibles, puede utilizar la máscara OUTREC FIELDS del programa de 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 enteras. El formato BCD empaquetado del 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 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 difuntas, de modo que los programas que las usan pueden ejecutarse sin modificaciones en las máquinas más nuevas.

La arquitectura Intel x86 admite un formato BCD exclusivo de 18 dígitos (diez bytes) que se puede cargar y almacenar desde los registros de punto 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 aplicaciones comerciales y financieras. Existen trucos para implementar operaciones BCD empaquetadas y operaciones de suma o resta decimales divididas en zonas utilizando secuencias cortas pero difíciles de entender de operaciones aritméticas binarias y lógicas en paralelo de palabras. Por ejemplo, el siguiente código (escrito en C ) calcula una suma BCD empaquetada de 8 dígitos sin signo utilizando operaciones binarias de 32 bits:

uint32_t BCDadd(uint32_t a, uint32_t b)
{
    uint32_t t1, t2;    // unsigned 32-bit intermediate values

    t1 = a + 0x06666666;
    t2 = t1 ^ b;                   // sum without carry propagation
    t1 = t1 + b;                   // provisional sum
    t2 = t1 ^ t2;                  // all the binary carry bits
    t2 = ~t2 & 0x11111110;         // just the BCD carry bits
    t2 = (t2 >> 2) | (t2 >> 3);    // correction
    return t1 - t2;                // corrected BCD sum
}

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 no contienen un microprocesador. Al emplear BCD, la manipulación de datos numéricos para la visualización se puede simplificar en gran medida al tratar cada dígito como un subcircuito único independiente. Esto se asemeja mucho más a la realidad física del hardware de pantalla: un diseñador puede optar por utilizar una serie de pantallas de siete segmentos idénticos 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 dicha pantalla requeriría un circuito complejo. Por lo tanto, en los casos en los que los cálculos son relativamente simples, trabajar con BCD puede conducir a un sistema en general más simple que convertir ay 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 agregando primero en binario y luego convirtiendo a BCD. La conversión de la suma simple de dos dígitos se puede hacer 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 (desde 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 "acarreo") no puede caber en un número binario de 4 bits. En BCD como en decimal, no puede existir un valor superior a 9 (1001) por dígito. Para corregir esto, se agrega 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 produce "17" en BCD, que es el resultado correcto.

Esta técnica se puede ampliar para agregar varios dígitos agregando 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 indicador de medio acarreo. para facilitar los ajustes aritméticos de BCD después de operaciones binarias de suma y resta. La CPU Z80 proporciona el código de operación DAA, acumulador de ajuste decimal, DAA

Sustracción

La resta se realiza sumando el complemento de diez 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 1001 se usa para representar un número negativo . Las 14 combinaciones restantes son signos inválidos. Para ilustrar la resta BCD con signo, considere 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. Al anteponer 568 en BCD por 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 resultar en 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 se suma un número diferente de nibbles (como 1053 - 2), el número con menos dígitos debe anteponerse primero con ceros antes de tomar el complemento de diez o restar. Por lo tanto, con 1053 - 2, primero tendría que representarse 2 como 0002 en BCD, y se tendría que calcular el complemento de diez de 0002.

Comparación con binario puro

Ventajas

  • Muchos valores no integrales, como el decimal 0.2, tienen una representación de valor posicional infinito en binario (.001100110011 ...) pero tienen un valor posicional finito en decimal codificado en binario (0.0010). En consecuencia, un sistema basado en representaciones decimales codificadas en binario de fracciones decimales evita errores al representar y calcular dichos valores. Esto es útil en cálculos financieros.
  • Escalar con una potencia de 10 es simple.
  • El redondeo al límite de un dígito decimal es más sencillo. La suma 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 una forma de carácter o para visualización (p. Ej., A un formato basado en texto como XML , o para impulsar señales para una visualización de siete segmentos ) es una asignación simple por dígito y se puede realizar en formato lineal ( O ( n )) tiempo. La conversión de binario puro implica una lógica relativamente compleja que abarca dígitos y, para números grandes, no se conoce ningún algoritmo de conversión de tiempo lineal (consulte Sistema de numeración binario § Conversión hacia y desde otros sistemas de numeración ).

Desventajas

  • Algunas operaciones son más complejas de implementar. Los sumadores requieren una lógica adicional para hacer que se envuelvan y generen un acarreo temprano. Se necesita entre un 15 y un 20 por ciento más de circuitos para agregar BCD en comparación con el binario puro. La multiplicación requiere el uso de algoritmos que son algo más complejos que shift-mask-add (se requiere una multiplicación binaria , que requiere cambios y sumas binarios o el equivalente, por dígito o grupo de dígitos).
  • El BCD estándar requiere cuatro bits por dígito, aproximadamente un 20 por ciento más de espacio que una codificación binaria (la relación de 4 bits a log 2 10 bits es 1,204). Cuando se empaqueta para que tres dígitos se codifiquen en diez bits, la sobrecarga de almacenamiento se reduce en gran medida, a expensas de una codificación que no está alineada con los límites de bytes 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 al soporte limitado del procesador para operaciones BCD nativas.

Variaciones representacionales

Existen varias implementaciones de BCD que emplean otras representaciones para los 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 por zonas, y cada uno codifica el signo numérico de una manera diferente:

Escribe Descripción Ejemplo
No firmado Sin señal mordisquear F1 F2 F3
Final firmado (formato canónico) Sign nibble en el último byte (menos significativo) F1 F2 C3
Líder firmado (overpunch) Signo nibble en el primer byte (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 por separado Byte de carácter de signo separado ( '+'o '−') que precede a los bytes de dígitos 2B F1 F2 F3

Telefonía decimal codificada en binario (TBCD)

3GPP desarrolló TBCD , una expansión a BCD donde las combinaciones de bits restantes (no utilizadas) se utilizan para agregar caracteres de telefonía específicos , con dígitos similares a los que se encuentran en el diseño original de los teclados telefónicos .


Dígito decimal
TBCD
8 4 2 1
* 1 0 1 0
# 1 0 1 1
a 1 1 0 0
B 1 1 0 1
C 1 1 1 0
Se usa 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 dígito de codificación 2 n

bits 4321 del octeto n dígito de codificación 2 ( n - 1) + 1

Número de significado 1234, se convertiría 21 43en 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 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 una multiplicación y división rápidas, pero puede requerir un desplazamiento de una 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, esta es casi una forma de aritmética de punto fijo, ya que la posición del punto de 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 pueden codificarse eficientemente en hardware con solo 2 o 3 retardos de puerta. El decimal densamente empaquetado (DPD) es un esquema similar que se utiliza para la mayor parte del significado , excepto el dígito inicial, para una de las dos codificaciones decimales alternativas especificadas en el estándar de coma 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 en ASCII para su visualización.

La familia de computadoras Atari de 8 bits utilizó 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 suministrado por el fabricante de la computadora de mano Psion Organizer 1 también utilizó por completo BCD para implementar el punto flotante; Los modelos Psion posteriores utilizaron binarios 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 fueran inoperables. Esto se conoce como el problema del año 2010 .

Historia legal

En el caso de 1972 Gottschalk v. Benson , la Corte Suprema de EE . UU. Revocó 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.

Ver también

Notas

Referencias

Otras lecturas

enlaces externos