Pergunta

Eu sei que o BCD é um tipo de dados mais intuitivo se você não conhece binário.Mas não sei por que usar essa codificação, é como não faz muito sentido, pois sua representação de resíduos em 4bits (quando a representação é maior que 9).

Também acho que o x86 suporta apenas adições e subs diretamente (você pode convertê-los via FPU).

É possível que isso venha de máquinas antigas ou de outras arquiteturas?

Obrigado!

Foi útil?

Solução

Eu acho que o BCD é útil para muitas coisas, as razões fornecidas acima. Uma coisa que é óbvia que parece ter sido esquecida é fornecer uma instrução para passar do binário para o BCD e o oposto. Isso pode ser muito útil na conversão de um número ASCII em binário para aritmático.

Um dos pôsteres estava errado sobre os números que estavam sendo armazenados frequentemente no ASCII, na verdade, muito armazenamento de número binário é feito porque é mais eficiente. E converter ascii em binário é um pouco complicado. O BCD é meio que o ASCII e o binário, se houvesse um BSDToint e o INTTOBCD Instruções, isso tornaria as conversões como tal realmente fáceis. Todos os valores ASCII devem ser convertidos em binário para aritmático. Portanto, o BCD é realmente útil nesse ASCII para conversão binária.

Outras dicas

A aritmética do BCD é útil para cálculos decimais exatos, o que geralmente é um requisito para aplicações financeiras, contabilidade etc. Também facilita as coisas como multiplicar/dividir por poderes de 10. Hoje em dia, existem alternativas melhores.

Há um bom Artigo da Wikipedia que discute o profissional e os contras.

O BCD é útil na extremidade mais baixa do espectro eletrônico, quando o valor em um registro é exibido por algum dispositivo de saída. Por exemplo, digamos que você tenha uma calculadora com vários displays de sete segmentos que mostram um número. É conveniente se cada exibição for controlado por bits separados.

Pode parecer implausível que um processador x86 moderno seja usado em um dispositivo com esses tipos de exibições, mas o x86 remonta a um grandes Way, e o ISA mantém muita compatibilidade com versões anteriores.

BCD é um desperdício de espaço, isso é verdade, mas tem a vantagem de ser um formato "pitch fixo", facilitando a localização do enésimo dígito em um número específico.

Outra vantagem é que é permite cálculos aritméticos exatos em números de tamanho arbitrário. Além disso, usando as características "fixo" mencionadas, essas operações aritméticas podem ser facilmente fundidas em vários threads (processamento paralelo).

BCD existe em processadores x86 CPU, pois foi o original do processador 8086, e todos os CPU x86 são 8086 compatível.BCD operações em x86 foram usados para suporte de aplicações de negócio caminho de volta então.BCD de apoio no próprio processador não é mais usado.

Note que a BCD é uma exata representação de números decimais, o que de ponto flutuante não é, e que a implementação BCD em hardware é muito mais simples do que de execução de ponto flutuante.Estas coisas importava mais para trás quando os processadores tinha menos de um milhão de transistores que funcionou em alguns megahertz.

Hoje em dia, é comum armazenar números em formato binário e convertê-los para formato decimal para fins de exibição, mas a conversão leva algum tempo.Se o objetivo principal de um número for ser exibido ou adicionado a um número que será exibido, pode ser mais prático realizar cálculos em formato decimal do que realizar cálculos em binário e converter para decimal.Muitos dispositivos com leituras numéricas e muitos videogames armazenavam números no formato BCD compactado, que armazena dois dígitos por byte.É por isso que muitos contadores de pontuação ultrapassam 1.000.000 de pontos, em vez de algum valor de potência de dois.Se o hardware não facilitasse a aritmética BCD compactada, a alternativa não seria usar binário, mas usar decimal descompactado.A conversão de BCD compactado em decimal descompactado no momento em que é exibido pode ser feita facilmente, um dígito de cada vez.A conversão de binário em decimal, por outro lado, é muito mais lenta e requer operação em toda a quantidade.

Aliás, o conjunto de instruções 8086 é o único que vi com instruções para "Ajuste ASCII para Divisão" e "Ajuste ASCII para Multiplicação", um dos quais multiplica um byte por dez e o outro divide por dez.Curiosamente, o valor "0A" faz parte das instruções da máquina, e a substituição por um número diferente fará com que essas instruções se multipliquem ou dividam por outras quantidades, mas as instruções não estão documentadas como sendo instruções de multiplicação/divisão por constante de uso geral. .Eu me pergunto por que esse recurso não foi documentado, visto que poderia ter sido útil?

Também é interessante notar a variedade de abordagens usadas pelos processadores para adicionar ou subtrair BCD compactado.Muitos realizam uma adição binária, mas usam um sinalizador para controlar se ocorreu um transporte do bit 3 para o bit 4 durante uma adição;eles podem então esperar que o código limpe o resultado (por exemploPIC), forneça um opcode para limpar a adição, mas não a subtração, forneça um opcode para limpar a adição e outro para a subtração (por exemplox86), ou use um sinalizador para rastrear se a última operação foi adição ou subtração e use o mesmo opcode para limpar ambos (por exemplo,Z80).Alguns usam opcodes separados para aritmética BCD (por exemplo68000), e alguns usam um sinalizador para indicar se as operações de adição/subtração devem usar binário ou BCD (por exemplo,6502 derivados).Curiosamente, o 6502 original executa matemática BCD na mesma velocidade que matemática binária, mas seus derivados CMOS exigem um ciclo extra para operações BCD.

Tenho certeza de que o artigo do Wiki vinculado ao Anterior entra em mais detalhes, mas usei o BCD na programação do mainframe IBM (no PL/I). O BCD não apenas garantiu que você pode procurar áreas específicas de um byte para encontrar um dígito individual - que às vezes é útil - mas também permitiu que o hardware aplique regras simples para calcular a precisão e a escala necessárias para adicionar ou multiplicar dois números.

Pelo que me lembro, me disseram que nos mainframes, o suporte ao BCD foi implementado em hardware e, naquele momento, era nossa única opção para representar números de pontos flutuantes. (Estamos falando de 18 anos aqui!)

Quando eu estava na faculdade há mais de 30 anos, me disseram que as razões pelas quais o BCD (Comp-3 em Cobol) era um bom formato.

Nenhuma dessas razões ainda é relevante com o hardware moderno. Temos aritmética de ponto fixo rápido e binário. Não precisamos mais ser capaz de converter BCD em um formato exibido adicionando um deslocamento a cada dígito BCD. Raramente armazenamos números como oito bits por dígito, portanto, o fato de o BCD levar apenas quatro bits por dígito não é muito interessante.

O BCD é uma relíquia e deve ser deixado no passado, onde pertence.

Muito poucos humanos podem dimensionar quantidades expressas no HEXA, por isso é útil mostrar ou pelo menos permitir visualizar o resultado intermediário em decimal. Especialmente no mundo financeiro ou contábil.

A computação moderna enfatizou a codificação que captura a lógica do design, em vez de otimizar alguns ciclos da CPU aqui ou ali. O valor do tempo e/ou da memória salvo geralmente não vale a pena escrever rotinas especiais no nível de bits.

Dito isto, o BCD ainda é ocasionalmente útil.

O único exemplo em que consigo pensar é quando você tem um enorme banco de dados Flatfiles ou outros big data desses big data que está em um formato ASCII como o CSV. O BCD é incrível se tudo o que você está fazendo é procurar valor entre alguns limites. Para converter todos os valores à medida que você digitaliza todos esses dados aumentariam bastante o tempo de processamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top