Come fa il computer a immagazzinare le cose in memoria?

Probabilmente si saprà che ogni cosa in un computer viene immagazzinata come stringhe di bit (cifra binaria; si possono immaginare come molti piccoli interruttori on-off). Ora spiegeremo come questi bit vengono impiegati per rappresentare le lettere e i numeri che il computer manipola.

Prima di poter affrontare questo argomento, è necessario comprendere la dimensione di parola del proprio computer. Si tratta della dimensione preferita dal computer per spostare unità di informazioni; tecnicamente è l'ampiezza dei registri del processore, ovvero le aree che il processore utilizza per compiere calcoli logici e aritmetici. Quando leggiamo che i computer hanno dimensione in bit (per esempio 32-bit o 64-bit) questo è ciò che significa.

La maggior parte dei computer ha una dimensione di parola di 64 bit. Nel passato recente (primi del 2000) molti pc avevano parole da 32 bit. Le vecchie macchine 286 nel 1980 avevano una dimensione di parola di 16. I calcolatori centrali vecchio stile spesso avevano parole di 36 bit.

Il computer vede la propria memoria come una sequenza di parole numerate da zero in avanti, fino a valori molto grandi dipendenti della dimensione della memoria. Tale valore è limitato dalla dimensione della parola, motivo per cui le vecchie macchine come i 286 dovevano svolgere complicati contorsionismi per indirizzare grandi quantità di memoria. Non li descriverò qui; procurano ancora degli incubi ai vecchi programmatori.

Numeri

I numeri interi sono rappresentati come parole o coppie di parole, a seconda della dimensione di parola del processore. Su macchine a 64 bit, la parola è la dimensione più comune.

L'aritmetica dei numeri interi è simile ma non è esattamente identica alla matematica in base due. Il bit di ordine più basso è 1, il successivo 2, poi 4 e così via come nella notazione binaria pura. Ma i numeri dotati di segno sono rappresentati in notazione complemento a due. Il bit di ordine più alto è un bit di segno che rende negativa la quantità rappresentata, mentre ogni numero negativo può essere ottenuto dal valore positivo corrispondente invertendo tutti i bit e aggiungendo uno. È per questo motivo che i numeri interi su una macchina a 64 bit devono essere compresi nell'intervallo tra -263 a 263 - 1. Quel 64-esimo bit è usato per il segno; 0 significa un numero positivo o zero, 1 un numero negativo.

Alcuni linguaggi di programmazione forniscono accesso a una aritmetica senza segno ovvero una artimetica in base 2 con solo lo zero e i numeri positivi.

La maggior parte dei processori e alcuni linguaggi possono eseguire operazioni con numeri a virgola mobile (funzionalità incorporata nel chip di tutti i processori recenti). I numeri a virgola mobile forniscono un intervallo più ampio degli interi e consentono di esprimere le frazioni. I modi in cui questo avviene sono diversi e un po' troppo complicati per essere affrontati in dettaglio qui, ma l'idea generale è molto simile alla cosiddetta ‘notazione scientifica’, dove si può scrivere (per esempio) 1.234 * 1023; la codifica del numero viene divisa in una mantissa (1.234) e in una parte esponenziale (23) che indica le potenze di dieci (significa che il numero moltiplicato dovrebbe avere 20 zeri su di esso, 23 meno i tre posti decimali).

Caratteri

I caratteri sono normalmente rappresentati come stringhe di sette bit, in una codifica chiamata ASCII (American Standard Code for Information Interchange). Sulle macchine moderne, ciascuno dei 128 caratteri ASCII è dato dai sette bit più bassi di un ottetto o byte a 8 bit; gli ottetti sono riuniti in parole di memoria in modo che (per esempio) una stringa di sei caratteri occupi solamente una parola di memoria a 64 bit. Per vedere una mappa dei caratteri ASCII, scrivere ‘man 7 ascii’ al prompt di Unix.

Il paragrafo precedente, però, non è completamente corretto, per due ragioni. Quella secondaria è che il termine ‘ottetto’ è formalmente corretto ma in realtà raramente usato; la maggior parte delle persone si riferisce a un ottetto come a un byte e ritiene che i byte siano lunghi otto bit. Per essere corretti, il termine ‘byte’ è più generale; per esempio, ci sono state macchine a 36 bit con byte di 9 bit (anche se probabilmente non capiterà più in futuro).

La ragione principale è, invece, che non tutto il mondo usa i codici ASCII. Di fatto, molti paesi non possono usarli. I codici ASCII, anche se funzionano bene per l'inglese americano, non contengono molte lettere accentate e altri caratteri speciali necessari per le altre lingue. Anche l'inglese britannico ha il problema della mancanza di un segno per la sterlina.

Ci sono stati diversi tentativi di risolvere questo problema. Tutti fanno uso dell'ottavo bit non usato dai codici ASCII, che in questo modo risultano la metà inferiore di un insieme di 256 caratteri. Quello più largamente utilizzato è l'insieme di caratteri ‘Latin-1’ (o più formalmente ISO 8859-1). Si tratta dell'insieme di caratteri predefinito per Linux, vecchie versioni di HTML, e X. Microsoft Windows usa una versione mutante di Latin-1 che aggiunge alcuni caratteri come le virgolette destre e sinistre, in posizioni lasciate libere da Latin-1 per ragioni storiche (per un serio resoconto dei problemi che ha provocato, vedere la pagina demoroniser).

Latin-1 gestisce le principali lingue europee, incluse l'inglese, francese, tedesco, spagnolo, italiano, olandese, norvegese, svedese, danese e islandese. Tuttavia, non è ancora sufficiente, per cui esiste una serie completa di insiemi di caratteri da Latin-2 a -9 per rappresentare il greco, l'arabo, l'ebraico, l'esperanto e il serbo-croato. Per maggiori dettagli vedere la pagina ISO alphabet soup.

La soluzione definitiva è uno standard enorme chiamato Unicode (e il suo gemello identico ISO/IEC 10646-1:1993). Unicode è identico a Latin-1 nella 256 posizioni più basse. Nello spazio successivo dei 16 bit comprende greco, cirillico, armeno, ebraico, arabo, devanagarico, bengalese, gurmukhi, gujarati, oriya, tamil, telugu, kannada, malese, tailandese, lao, georgiano, tibetano, giapponese kana, l'insieme completo del coreano hangul moderno e un insieme unificato di ideogrammi cinesi/giapponesi/coreani (CJK). Per maggiori dettagli vedere la Unicode Home Page. L'XML el'XHTML usano questo insieme di caratteri.

Versioni di Linux recenti usano una codifica di Unicode chiamata UTF-8. In UTF, i caratteri 0-127 sono ASCII. I caratteri 128-255 sono usati solo nelle sequenze da 2 a 4 byte che identificano caratteri non-ASCII.