Come fanno i calcolatori ad aritmetica binaria ad elaborare numeri introdotti in forma decimale? La trasformazione avviene a livello hardware o software e come funziona? La divisione successiva per 2 implicherebbe la presenza di un processore decimale. So che esiste la codifica BCD ma essa non trasforma il numero decimale in uno propriamente binario.

Tutti i calcolatori elettronici o computer elaborano i numeri e le informazioni usando l'aritmetica binaria. Questa prevede l'uso di una rappresentazione numerica composta da due soli simboli 0 e 1, chiamati anche OFF e ON, oppure basso e alto. In pratica i computer sono composti solo da circuiti elettronici digitali, e tutte le informazioni al loro interno sono rappresentate dalla presenza di una tensione elettrica (ad esempio 3.3 V) oppure dalla sua assenza (0 Volt). Non vengono usati i livelli intermedi per evitare errori di riconoscimento del valore e quindi del simbolo o cifra rappresentato, ed essere così immuni al rumore di tensione che invece affligge l'elettronica di tipo analogico. Sarebbe teoricamente possibile realizzare dei "processori decimali", cioè capaci di elaborare numeri a 10 livelli, direttamente in base 10, ma si è visto che questo richiede circuiti molto complessi, soggetti ad errori di elaborazione e comunicazione. Ne consegue che non si riesce ad ottenere gli stessi benefici ottenibili con l'elettronica digitale, per cui sono stati abbandonati. Infatti l'uso dell'elettronica digitale semplifica anche la circuiteria per le funzioni di base e come conseguenza permette di realizzare circuiti estremamente veloci nell'elaborare e trasmettere le informazioni, dal consumo molto basso e ottenendo funzioni composite molto complesse, realizzate con l'integrazione di tantissimi (decine di milioni) circuiti semplici in pochissimo spazio.

Per poter rappresentare numeri grandi, si usano tante cifre binarie affiancate, analogamente a quello che si fa con il sistema decimale per rappresentare numeri più grandi del 9. Ovviamente con il sistema binario saranno necessarie molte più cifre per rappresentare lo stesso numero equivalente decimale. Chiaramente si può sempre convertire un numero dalla notazione binaria (usata internamente ai circuiti) a quella decimale (usata dagli umani) e viceversa.

La rappresentazione dei caratteri, tra cui i numeri decimali (ma anche di lettere e punteggiatura), nei computer avviene attraverso un codice convenzionale, in passato era l'ASCII dove i simboli decimali di una cifra da 0 a 9 erano rappresentati con i numeri da 48 a 57 (011 0000 e 011 1001 in binario), dal 2000 in avanti si è passati gradualmente allo standard ISO Unicode, dove si usano più bytes per ogni simbolo, ma il concetto è lo stesso. Dal 2007 lo standard Unicode UTF-8 ha superato ASCII come diffusione, anche perché è retrocompatibile, ed ora ASCII è stato praticamente abbandonato.

Quindi, potrà sorprendere il lettore, i numeri al momento dell'inserimento non sono trattati né come decimali né come binari, non sono trattati del tutto come numeri, ma come caratteri alfanumerici. Tipicamente al momento dell'inserimento da parte di un operatore i numeri sono memorizzati e rappresentati mediante caratteri e simboli UTF-8, poi è il software mediante una libreria a convertirli nei corrispondenti numeri in base decimale come tipicamente è richiesto. Un modo semplice per fare la conversione di un carattere a numero intero ad una cifra, è sottrarre 48 al codice UTF-8 (lo stesso avveniva con l'ASCII). Per numeri a più cifre basta pesarle sulla base della posizione. Quasi universalmente si scrivono le cifre con peso maggiore alla sinistra di quelle a peso minore, così avviene ad esempio per le decine rispetto alle unità con la base 10. Conoscendo la base in cui è scritto un numero si può comprendere quanto vale ed eventualmente convertirlo in altre basi. Ad esempio per convertire un numero decimale in binario si può dividere un numero per 2 molte volte e tenere i quozienti parziali. Per un approfondimento su questo aspetto si può vedere questa risposta precedente.

Per i numeri non interi in realtà le cose sono più complicate, perché la rappresentazione interna avviene quasi sempre mediante virgola mobile, in cui il numero viene diviso in mantissa ed esponente e memorizzati separatamente.

 

Però non bisogna dimenticare che quello che per il software e per l'utente è un carattere o un numero in base decimale, in realtà per l'hardware è già un numero binario e come tale sarà memorizzato fin dall'inizio. Alla base è l'hardware ad eseguire le istruzioni software (compresa la sopracitata libreria di conversione), e il software (sia quello scritto con linguaggi ad alto livello, ma anche quello di base come l'assembler) è solo una rappresentazione mnemonica di segnali e comportamenti dei circuiti elettronici. Quindi la conversione decimale-binario e viceversa, nella realtà non avviene per il semplice inserimento di numeri. Concretamente nel momento in cui un operatore "inserisce" per esempio un cinque, sul video verrà mostrato un simbolo grafico corrispondente nella codifica Unicode che ha questo aspetto "5", ma internamente l'elettronica memorizzerà e gestirà i livelli elettrici 0011 0101 (codepoint UTF-8 per il numero 5), che dopo la conversione in numero da parte della libreria diventa 0000 00101 che è la rappresentazione in binario del numero 5.

L'hardware al livello base memorizza ed elabora esclusivamente numeri binari, fino a produrre il risultato, cioè l'elettronica digitale non vedrà mai il numero in decimale come lo vede l'utente.

A quel punto è nuovamente il software che converte i numeri in caratteri UTF-8 da rappresentare sullo schermo per l'utente (ad esempio sommando 48) e componendo il nuovo simbolo da mostrare.

 

La domanda del lettore sulle divisioni successive, sottintende che un numero decimale può essere diviso per due più volte per ottenere il suo equivalente in binario, ma come spiegato sopra, questa "elaborazione" non avviene normalmente nei computer, e questa tecnica è usata solamente per trovare il numero binario equivalente per diagnostica, per ottimizzazioni o altri scopi dell'utente o più facilmente degli sviluppatori e progettisti degli stessi.

 

Riguardo al "processore decimale", tutti i microprocessori in commercio oggi giorno incorporano anche un coprocessore a virgola mobile implementato in hardware, usato per effettuare conti con numeri "non interi" o con esponente e operazioni matematiche complesse (come trigonometria, logaritmi, esponenziali, ecc), in tempi molto rapidi. Non è esattamente quello che probabilmente intendeva il lettore con "processore decimale" perché anche questo coprocessore alla base impiega sempre l'aritmetica binaria e circuiti digitali, ma il tutto avviene come se lo fosse, con il vantaggio di avere grandi prestazioni in termini di velocità.

 

Infine la codifica BCD rappresenta ogni cifra decimale mediante un Byte o più semplicemente mediante un nibble (4 bit). Anche i numeri rappresentati mediante codice BCD possono essere non interi. Questa codifica può essere intesa come una alternativa agli altri tipi di rappresentazioni dei numeri. Era usata nei primi computer e nell'elettronica digitale pre-microprocessori, ma non è molto usata nella pratica attuale perché richiede circuiteria aggiuntiva dedicata ai calcoli e spreca maggiore spazio per la memorizzazione. Infatti in 4 bit con la rappresentazione binaria si possono memorizzare numeri da 0 a 15, con il BCD si memorizzano solo i numeri da 0 a 9. Attualmente si usa esclusivamente dove gli arrotondamenti dovuti alla conversione in virgola mobile non sono tollerabili. Anche le operazioni su numeri BCD, nei processori attuali sono implementate in hardware mediante circuiti digitali e algebra binaria, con gestione speciale del riporto al 10 (che non è una potenza di 2).