Domanda

So che BCD è un tipo di dati più intuitivo se non conosci il binario.Ma non so perché usare questa codifica, è come se non abbia molto senso poiché la sua rappresentazione di rifiuti in 4 bit (quando la rappresentazione è maggiore di 9).

Inoltre penso che x86 supporti direttamente solo aggiunte e sottotitoli (puoi convertirli tramite FPU).

È possibile che provenga da vecchie macchine o da altre architetture?

Grazie!

È stato utile?

Soluzione

Penso che BCD sia utile per molte cose, le ragioni sopra indicate. Una cosa che è un po 'ovvia che sembra essere stata trascurata è fornire un'istruzione per passare dal binario a BCD e il contrario. Ciò potrebbe essere molto utile per convertire un numero ASCII in binario per aritmatico.

Uno dei poster aveva sbagliato sul numero di numeri immagazzinato spesso in ASCII, in realtà un sacco di archiviazione di numeri binari è fatto perché è più efficiente. E la conversione di ASCII in binario è un po 'complicato. BCD è un po 'tra l'ASCII e il binario, se ci fossero istruzioni BSDToint e IntTobCD, renderebbe le conversioni come davvero così facili. Tutti i valori ASCII devono essere convertiti in binario per aritmatico. Quindi, il BCD è effettivamente utile in quella conversione binaria ASCII.

Altri suggerimenti

L'aritmetica BCD è utile per i calcoli decimali esatti, che spesso è un requisito per applicazioni finanziarie, contabilità, ecc. Fa anche cose come la moltiplicazione/divisione per poteri di 10. In questi giorni ci sono alternative migliori.

C'è un bene Articolo di Wikipedia che discute i professionisti e i contro.

BCD è utile all'estremità molto bassa dello spettro elettronico, quando il valore in un registro viene visualizzato da un dispositivo di uscita. Ad esempio, supponiamo di avere un calcolatore con un numero di display a sette segmenti che mostrano un numero. È conveniente se ogni display è controllato da bit separati.

Può sembrare non plausibile che un moderno processore X86 venga utilizzato in un dispositivo con questi tipi di display, ma x86 torna indietro a lungo modo, e l'ISA mantiene una grande compatibilità arretrata.

Il BCD è dispendioso per lo spazio, è vero, ma ha il vantaggio di essere un Formato "Pitch fisso", rendendo facile trovare l'ennesima cifra in un numero particolare.

Un altro vantaggio è che è consentito Calcoli aritmetici esatti sui numeri di dimensioni arbitrarie. Inoltre, utilizzando le caratteristiche del "tono fisso" menzionate, tali operazioni aritmetiche possono essere facilmente bloccate in più thread (elaborazione parallela).

Puoi dare pop un indice come argomento :

>>> lst = ['a', 'b', 'c', ' ', 'd']
>>> lst.pop(lst.index(' ') - 1)
'c'
>>> lst
['a', 'b', ' ', 'd']
.

Ovviamente è necessario assicurarsi che l'articolo ' ' abbia un indice>= 1 prima.Se non è necessario il valore rimosso, è possibile utilizzare invece del lst[index].

Al giorno d'oggi, è normale memorizzare i numeri in formato binario e convertirli in formato decimale a scopo di visualizzazione, ma la conversione richiede del tempo.Se lo scopo principale di un numero è quello di essere visualizzato o di essere aggiunto a un numero che verrà visualizzato, potrebbe essere più pratico eseguire calcoli in formato decimale piuttosto che eseguire calcoli in binario e convertirli in decimale.Molti dispositivi con letture numeriche e molti videogiochi memorizzano i numeri in formato BCD compresso, che memorizza due cifre per byte.Questo è il motivo per cui molti contatori di punteggio superano 1.000.000 di punti anziché una potenza di due.Se l'hardware non facilitasse l'aritmetica BCD compressa, l'alternativa non sarebbe quella di utilizzare il binario, ma utilizzare il decimale non compresso.La conversione del BCD compresso in decimale non compresso nel momento in cui viene visualizzato può essere facilmente eseguita una cifra alla volta.La conversione da binario a decimale, al contrario, è molto più lenta e richiede di operare sull'intera quantità.

Per inciso, il set di istruzioni 8086 è l'unico che ho visto con le istruzioni per "Regolazione ASCII per divisione" e "Regolazione ASCII per moltiplicazione", una delle quali moltiplica un byte per dieci e l'altra divide per dieci.Curiosamente, il valore "0A" fa parte delle istruzioni della macchina e la sostituzione di un numero diverso causerà la moltiplicazione o la divisione di tali istruzioni per altre quantità, ma le istruzioni non sono documentate come istruzioni di moltiplicazione/divisione per costanti di uso generale. .Mi chiedo perché quella funzionalità non sia stata documentata, dato che avrebbe potuto essere utile?

È anche interessante notare la varietà di approcci utilizzati dai processori per aggiungere o sottrarre BCD compressi.Molti eseguono un'addizione binaria ma utilizzano un flag per tenere traccia se si è verificato un riporto dal bit 3 al bit 4 durante un'addizione;potrebbero quindi aspettarsi che il codice ripulisca il risultato (ad es.PIC), fornire un codice operativo per pulire l'addizione ma non la sottrazione, fornire un codice operativo per pulire l'addizione e un altro per la sottrazione (ad es.x86) oppure utilizzare un flag per tenere traccia se l'ultima operazione è stata un'addizione o una sottrazione e utilizzare lo stesso codice operativo per ripulirle entrambe (ad es.Z80).Alcuni utilizzano codici operativi separati per l'aritmetica BCD (ad es.68000) e alcuni utilizzano un flag per indicare se le operazioni di addizione/sottrazione devono utilizzare binario o BCD (ad es.6502 derivati).È interessante notare che il 6502 originale esegue la matematica BCD alla stessa velocità della matematica binaria, ma i suoi derivati ​​CMOS richiedono un ciclo aggiuntivo per le operazioni BCD.

Sono sicuro che l'articolo wiki collegato a prima va più in dettaglio, ma ho usato BCD sulla programmazione mainframe IBM (in PL/I). BCD non solo garantisce che si potesse guardare a aree particolari di un byte per trovare una cifra individuale - che a volte è utile - ma ha anche permesso all'hardware di applicare regole semplici per calcolare la precisione e la scala richieste per l'aggiunta o la moltiplicazione di due numeri insieme.

Come ricordo, mi è stato detto che sui mainframe, il supporto per BCD era implementato in hardware e in quel momento era la nostra unica opzione per rappresentare i numeri di punta mobile. (Stiamo parlando di 18 anni vai qui!)

Quando ero al college oltre 30 anni fa, mi è stato detto i motivi per cui BCD (Comp-3 a Cobol) era un buon formato.

Nessuno di questi motivi è ancora rilevante con l'hardware moderno. Abbiamo aritmetico a punto fisso veloce e binario. Non abbiamo più bisogno di essere in grado di convertire il BCD in un formato visualizzabile aggiungendo un offset a ciascuna cifra BCD. Raramente memorizzano numeri come otto bit per cifre, quindi il fatto che BCD prenda solo quattro bit per cifre non è molto interessante.

Il BCD è una reliquia e dovrebbe essere lasciato in passato, a cui appartiene.

Pochissimi umani possono dimensioni di dimensioni espresse in hexa, quindi è utile mostrare o almeno consentire il risultato dell'intermediario in decimale. Specialmente nel mondo finanziario o contabile.

Il calcolo moderno ha enfatizzato la codifica che cattura la logica del design anziché ottimizzare alcuni cicli della CPU qui o lì. Il valore del tempo e/o della memoria salvata spesso non vale la pena scrivere routine speciali a livello di bit.

Detto questo, il BCD è ancora occasionalmente utile.

L'esempio a cui riesco a pensare è quando si dispone di un enorme database piatto o altri big tali che si trovano in un formato ASCII come il CSV. BCD è fantastico se tutto ciò che stai facendo è cercare valore tra alcuni limiti. Per convertire tutti i valori mentre si scansiona tutti i dati aumenterebbero notevolmente i tempi di elaborazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top