Capitolo 4. - NUMERAZIONE ED ARITMETICA BINARIA

 

 

 

                4.1 - Numerazione in base due.

 

                La minima base  compatibile con la notazione posizionale e' due; la sequenza di simboli iniziali si riduce a:

 

  (4.1.1)                   0 , 1

 

e per la quantita' successiva (2 decimale) si deve subito definire:

 

  (4.1.2)                   10 = 1 + 1 ,

 

poiche' l'unita' '1' e' allo stesso tempo l'ultimo numero cui corrisponde un simbolo semplice.

 

                Le coppie ordinate si riducono a:

 

  (4.1.3)                   00 , 01 , 10 , 11

 

ed e' quindi subito necessario procedere con:

 

  (4.1.4)                   100 = 11 + 1 ,

 

con cui valori decimali 4, 5, 6, 7 spno scritti rispettivamente come:

 

  (4.1.5)                   100 , 101 , 110 , 111

 

ed il valore immediatamente successivo, 8 decimale, e' :

 

  (4.1.6)                   1000 = 111 + 1

 

e cosi' di seguito.

 

                Non vi e' nulla di sostanzialmente nuovo rispetto agli esempi ottale ed esadecimale gia' visti. La riduzione al minimo possibile della base ha come effetto la massima lunghezza possibile per le scritture dei numeri, ma la notazione ottenuta e' ancora posizionale.

 

                Vale l'unicita' della decomposizione di un numero in potenze della base secondo le (4.6.11), (4.6.12) con tutte le conseguenze che ne derivano; in particolare, le potenze pure della base sono sempre espresse da un '1' seguito da tanti  '0' quant'e' il valore della base e tutte le operazioni aritmetiche sono eseguibili con gli algoritmi consueti.

 

 

 

 

                4.2 - Conversione tra numeri binari ed altre basi.

 

                Con i numeri binari i coefficienti di ogni potenza della base sono solo 0 ed 1, ossia ogni potenza c'e', oppure non c'e'; questo rende particolarmente agevole la 'traduzione' di un numero binario in un'altra base. Ad esempio, dato:

 

  (4.2.1)                   10011

 

da intendere come espressione binaria e da tradurre in decimale, e' sufficiente leggere da destra:

 

  (4.2.2)                   1 si' , 2 si' , 4 no , 8 no , 16 si'

 

per ottenere il valore decimale:

 

 

 

 

  (4.2.3)                   1 + 2 + 16 = 19 ( = 10011 binario ).

 

                E' ancora piu' semplice convertire in ottale o esadecimale, poiche' entrambe queste basi sono potenze di due, ed ogni gruppo di tre, o rispettivamente quattro, cifre binarie e' immediatamente associabile ad una sola cifra nella nuova base.

 

                Ad esempio col valore (4.2.1) basta riscrivere, nei due casi:

 

  (4.2.4)                   10 011 1 0011

 

e tradurre in sequenze di simboli semplici:

 

  (4.2.5)                   23 (ottale) 13 (esadecimale) .

 

                Almeno per le basi dieci, otto e sedici e' abbastanza semplice anche la traduzione inversa.

 

                Per i numeri ottali o esadecimali e' infatti sufficiente 'esplodere' ogni cifra in una sequenza di tre, o rispettivamente quattro valori binari, mentre per i numeri decimali il procedimento e' meno immediato, richiedendo una scomposizione esplicita in potenze di due del numero da convertire.

 

                Ad esempio, il precedente 19 decimale deve essere visto come:

 

  (4.2.6)                   19 = 16 + 3 = 16 + 2 + 1

                                    = 16 * 1 + 8 * 0 + 4 * 0 + 2 * 1 + 1 * 1

 

individuando la massima potenza di due in esso contenuta, eliminandola con una differenza e procedendo cosi' fino al fondo.

 

                Il medesimo risultato si puo' ottenere eseguendo una serie di divisioni per due, che equivale ad isolare i resti rispetto alle potenze del due, ma in ordine inverso:

 

  (4.2.7)                   19 = 2 * 9 + 1

                                 9 = 2 * 4 + 1

                                 4 = 2 * 2 + 0

                                 2 = 2 * 1 + 0

                                 1 = 2 * 0 + 1

 

                I numeri sulla destra soni i resti di ogni divisione; essi formano, letti dal fondo, la sequenza di cifre binarie del numero decimale 19.

 

                Le 'scorciatoie' sono possibili da un lato per la familiarita' con la rappresentazione decimale, dall'altro per le particolari relazioni che sussistono tra due, otto e sedici.

 

                Se si trattasse di altri numeri, ad esempio della conversione da base due a base tre, il problema sarebbe un po' piu' complesso e richiederebbe una soluzione di tipo generale, riconducibile al metodo per divisioni successive.1

 

 

 

 

                4.3 - Unita' binaria: BIT

 

                La notazione binaria e' del tutto equivalente a quella decimale per le capacita' operative; essa e' quindi il mezzo di rappresentazione ideale per le esigenze di una macchina da calcolo costruita con dispositivi bistabili, che

 

 

[GB-CdC1] 

 

 

 

 

senza pretesa di aderenza alla realta' costruttiva, potremmo immaginare come microinterruttori i cui due stati stabili diciamo aperto e chiuso.

 

                I due stati possono essere associati alle due cifre 0 ed 1, ad esempio rispettivamente per aperto e chiuso, con scelta arbitraria, ma che verra' mantenuta in modo coerente.

 

                In questo modo si e' definita la cifra binaria, o binary digit, da cui la contrazione BIT, che e' la denominazione oramai comune per le componenti ultime o 'atomi' di informazione, la cui espressione naturale sta apputo nella dualità della coppia SI/NO, o anche VERO/FALFO.

 

                Un bit esaurisce con i suoi due valori la propria capacita' informativa, ma con una opportuna organizzazione e' possibile impiegarlo per rappresentare oggetti piu' complessi, ad esempio numeri grandi a piacere.

 

                Se si considera una successione ordinata e finita di microinterruttori indipendenti, ad esempio di lunghezza otto ( scelta non casuale, come si vedrà tra breve ), si ottiene la sequenza ordinata:

 

   (4.3.1.) 0000 0000 ,  0000 0001 ,  0000 0010 ,  0000 0110 ,  .. ,  0110 0010 ,  ..  ,  1111 1110 ,  1111 1111,

 

cioè la rappresentazione dei naturali decimali da 0 a 255; si può osservare che questo spazio di rappresentazione dei naturali interi è molto limitato, ma la scelta ha solo titolo di esempio. E’invece più importante notare che sono stati rappresentati solo numeri naturali, o non negativi, ma questo argomento sarà l’oggetto del prossimo capitolo.

 

                La quantita' di valori rappresentati su un numero finito di posizioni assegnate e' facilmente calcolabile: poiche' ogni nuova posizione raddoppia le combinazioni possibili, con n bit si possono formare esattamente 2n sequenze distinte. Ad esempio, con 4 bit si ha la possibilita' di rappresentare tutti i numeri da 0 a 15, cioe' in totale sedici interi; con 10 bit da 0 a 1023 e cosi' via.

 

                La 'misura naturale' di una macchina binaria e' data dalle potenze del due, non da quelle del dieci; le prime in ordine crescente sono:

 

  (4.5.1)                   1 = 20, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 = 210 .

 

                Di esse ha particolare importanza l'ultima, molto vicina alla terza potenza di dieci (1000), tanto da essere diventata, con le sue potenze, la misura corrente della capacita' delle memorie centrali o periferiche e del flusso trattabile nei canali di comunicazione. In gergo, K (da kilo) per 1024 ed M (da mega) per 1024 * 1024. Per grandi capacita' si impiega anche G (per giga), cioe' 1024 * 1024 * 1024.

 

 

 

                4.4 - Aggregazione di unita' binarie: BYTE

 

 

                Per ottenere capacita' di rappresentazione significative e' quindi necessario aggregare i bit in sequenze, la cui lunghezza determina il valore del massimo intero ottenibile; si deve allora prendere una decisione sull’estensione dell’aggregazione, definire cioe' una 'molecola' che diventi l'oggetto di riferimento, e che sia trattata dalle operazioni di macchina come un’entita' indivisibile.

 

                Mentre per la ‘potenza espressiva’ converrebbero le sequenze piu' lunghe possibili, le esigenze operative farebbero invece favorire le piu' brevi; il criterio oggi prevalente definisce come unita' di otto bit, detta byte, il cui contenuto e' completamente descritto dalla (4.3.1); ecco perchè la scelta delle otto posizioni per l'esempio non e' stata casuale.

 

                Ognuno dei due gruppi di quattro bit di un bity è anche detto nibble, che costituisce un semplice nome di riferimento, al quale non corrispondono in genere operazioni significative.

 

 

 

 

 

 

 

                La (4.3.1) elenca in ordine naturale le sequenze possibili all'interno di un byte, corrispondenti ai numeri 0, 1, 2, 3, ..., 98, ..., 254, 255, per un totale di 28 = 256 combinazioni, intervallo troppo limitato per fini aritmetici pratici e certamente da ampliare; il byte e' comunque il 'mattone da costruzione' per le definizioni successive.

 

                Si deve notare esplicitamente che la scelta di una sequenza di otto bit e' del tutto arbitraria, anche se l'aggregazione in una potenza di due e' forse piu' opportuna di altre; esistono infatti macchine con criteri diversi, in cui ad esempio in cui l’aggregazione minima è data da  sei bit.

 

                Quella da noi descritta e' pero' oramai una scelta pressoche' universale, su cui e' basata non solo la costruzione degli elaboratori, ma anche dei dispositivi periferici (tastiere, video, stampanti, plotter, dischi, ecc.).

 

                Il byte e' l'elemento di riferimento della memoria del calcolatore, la cui estensione e' appunto misurata in byte (Kb o Mb), dei dischi o memorie periferiche, misurati in Kb, Mb, o Gb, come pure delle comunicazioni tra macchine: dalla tastiera alla memoria o dalla memoria ad una stampante o anche tra calcolatori collegati in una rete, il flusso di informazioni e' una sequenza ordinata di byte.

 

 

 

                4.5 - Codifica dei caratteri.

 

                Ai fini del calcolo la capacita' di un byte e' molto limitata; esso non viene generalmente impiegato per il calcolo, ma per la sua rappresentazione dei caratteri, ossia delle unita' significative nello scambio di informazioni uomo-macchina e tra macchine.

 

                L'esecuzione di operazioni piu' o meno complesse (insieme di calcoli o altro) viene fatta scrivendo programmi simili a normali testi, i quali sono sequenze di caratteri organizzate secondo convenzioni che li rendono simili a quelli consueti nella comunicazione umana (libri, giornali, lettere, ecc..).

 

                La necessita' di rappresentare caratteri in modo non ambiguo richiede una loro codifica convenzionale, per la quale il byte e' perfettamente adatto; vi sono state diverse proposte a riguardo, ridotte oramai a due sole tabelle indicate con le sigle EBCDIC (Extended Binary CoDe for Information interChange) ed ASCII (American Standard Code for Information Interchange).

 

                La prima di esse (evoluzione di una piu' vecchia BCDIC) ha avuto origine ed e' attualmente diffusa su grandi sistemi , o mainframes, mentre la seconda e' nata in un tempo successivo con i minicomputers ed ha ricevuto grande impulso dalla comparsa dei personal.

 

                La dualita' delle codifiche, con i conseguenti problemi di traduzione da un contesto all'altro, e' un esempio di soluzioni multiple per lo stesso problema, raggiunte parallelamente in piu' contesti e delle quali nessuna ha la capacita' di imporsi in modo definitivo.

 

 

 

 

                4.6 - Codifica ASCII.

 

                La tabella ASCII standard prevede la codifica per 128 valori, da 0 a 127 ed utilizza quindi solo sette degli otto bit disponibili; viene riportata sotto la parte che inizia con il valore 32, indicato con (sp) e comunemente detto blank, o spaziatura.

 

                Per codifica si intende che ad ogni valore numerico si fa corrispondere un ben preciso segno grafico; nella tabella i segni sono riportati alla destra dei corrispondenti valori.

 

 

 

 

 

 

 

 

 

  (4.6.1)   32           40 (         48 0        56 8        64 @      72 H       80 P       88 X       96 `         104 h     12 p        120 x

                33 !         41 )         49 1        57 9        65 A       73 I         81 Q       89 Y       97 a        105 i      113 q      121 y

                34 "        42 *        50 2        58 :         66 B       74 J        82 R       90 Z       98 b        106 j      114 r      122 z

                35 #        43 +        51 3        59 ;         67 C       75 K       83 S       91 [         99 c        107 k     115 s      123 {

                36 $        44 ,         52 4        60 <        68 D       76 L       84 T       92 \         100 d      108 l      116 t      124 |

                37 %     45 -         53 5        61 =        69 E        77 M      85 U       93 ]         101 e      109 m    117 u     125 }

                38 &      46 .         54 6        62 >        70 F        78 N       86 V       94 ^       102 f      110 n     118 v      126 ~

                39 '         47 /         55 7        63 ?        71 G       79 O       87 W      95 _        103 g     111 o      119 w     127

 

                ( 32 = (sp) , 127 = (del) )

 

                Un byte rappresenta quindi il simbolo 'A', codificato come 65, se la sequenza di bit e' 0100 0001 (poiche' 65 = 64 + 1 ). Cio' significa che la pressione del tasto 'A' (maiuscolo) sulla tastiera deve avere come effetto la generazione ordinata di questi otto bit, oppure che il controllo del video deve attivare i fosfori di una certa zona in modo tale da generare la configurazione fisica 'A' quando riceve la medesima informazione.

 

                I caratteri corrispondenti a lettere maiuscole sono stati codificati tutti consecutivamente in modo da conservarne l'ordinamento e poiche' le lettere minuscole come segni grafici sono ben distinte da quelle maiuscole, per esse esiste un secondo segmento di valori.

 

                Il carattere '0' non e' stato codificato al posto 'zero', come forse sarebbe sembrato naturale fare, ma con 48 (0011 0000) e le successive cifre numeriche lo seguono ordinatamente; il valore iniziale, o byte nullo, e' riservato ad altri scopi che verranno illustrati piu' avanti.

 

                Si dicono caratteri alfabetici le lettere A .. Z, oppure a .. z, numerici i simboli 0 .. 9 ed alfanumerici gli uni e gli altri assieme; simboli grafici che non sono ne' lettere, ne' cifre occupano gli intervalli liberi: 32 .. 47, 58 .. 64, 91 .. 96 e 123 .. 127 ed in alcuni contesti sono detti simboli speciali.

 

                In particolare il valore 32, che nella (4.6.1) compare al primo posto, non e' indicato come un normale simbolo grafico, ma con la sequenza (sp); cio' perche' tale codice rappresenta lo spaziatura, o blank, che e' importante potere distinguere, esattamente come i segni grafici 'effettivi', perche' nel corso della scrittura di una riga passare su una posizione senza attivare fosfori o stampare punti e' una azione da descrivere esplicitamente.

 

                Nel caso del blank per definizione non esiste segno grafico; nella tabella questo viene evidenziato con la speciale scrittura (sp), da intendere come sigla mnemonica per la funzione svolta. Anche l'ultimo posto della lista (127) e' stato descritto come una funzione (del) e non in modo grafico, ma di esso ci occuperemo piu' avanti, unitamente al segmento iniziale dei valori 0 .. 31 che nella (4.4.1) non compare.

 

                I caratteri rappresentati nella tabella ASCII si possono considerare come un insieme ordinato utilizzando direttamente per ogni elemento la sua codifica numerica3; per quanto riguarda lettere e numeri si riproducono le relazioni consuete, con la convenzione che i caratteri numerici precedono gli alfanumerici maiuscoli e questi i minuscoli.

 

 

 

                4.7 - Caratteri e sequenze di controllo

 

                Al segmento iniziale di valori 0 .. 32 la (4.6.1) non associa alcun carattere grafico, ossia i byte con tali contenuti non sono utilizzati per descrivere un'azione che si traduca, ad esempio, con la formazione di insiemi di punti su video o carta.

 

                Essi descrivono egualmente azioni, ma di altra natura; ad esempio e'convenzione universale che un byte con contenuto 7 (0000 0111), descritto come funzione (bel), da bell, o campana, provochi l'attivazione del segnale acustico di cui quasi tutti i dispositivi periferici sono dotati (i tipici beep delle apparecchiature elettroniche).

 

                Un altro valore importante e' il 13 (0000 1101), indicato con (cr) da carriage return, o ritorno del carrello, per richiedere l'azione di chiusura della riga corrente ed il passaggio alla prima colonna;esso è di norma accompagnato do 10 (0000 1010), indicato con (lf) o line feed, che denota il passaggio alla riga successiva.

 

 

 

                Altri esempi ancora di uso frequente sono: 12 (0000 1100) o (ff), da form feed, o alimentazione pagina, che provoca il passaggio immediato all'inizio di una nuova pagina di stampa ed in qualche caso la pulizia del video (scelta non standard); oppure 26 (0001 1010) o (eof), da end of file, normalmente utilizzato per indicare la fine di un testo.

 

                La tabella completa dei codici di controllo e':

 

  (4.7.1)                   000 (nul)               008 (bs)                 016 (dle)               024 (can)

                               001 (soh)              009 (tab)               017 (dc1)              025 (em)

                               002 (stx)               010 (lf)                  018 (dc2)              026 (eof)

                               003 (etx)               011 (vt)                  019 (dc3)              027 (esc)

                               004 (eot)               012 (np) 020 (dc4)              028 (fs)

                               005 (enq)              013 (cr)                 021 (nak)              029 (gs)

                               006 (ack)              014 (so)                 022 (syn)              030 (rs)

                               007 (bel)               015 (si)                 023 (etb)               031 (us)

 

                Non ne commentiamo in dettaglio i significati, variabili d'altra parte con i contesti; molti dei codici hanno lo scopo di permettere una ordinata comunicazione tra unita' centrale e periferiche, o tra varie unita' centrali.

 

                E' particolarmente importante il 27 (0001 1011), o (esc), per il quale si ha anzi un apposito tasto escape, la cui funzione e' in genere quella di innescare specifiche azioni di controllo; la piu' semplice, attualmente molto diffusa per i programmi applicativi, e' l'uscita dal contesto in cui si sta operando.

 

                Sono state definite delle particolari sequenze di byte inizianti con (esc), dette sequenze ANSI standard,o anche sequenze di escape; i programmi applicativi possono attivarle emettendo normali richieste scritture, destinate ad un canale di comunicazione esterno: video, stampante, disco, ecc..

 

                L'effetto non e' la reale scrittura della sequenza di caratteri, ma un’azione codificata piu' o meno complessa, magari articolata in diverse possibilita', o parametrizzata. Naturalmente, ciò presume che il dispositivo che riceve questa comunicazione sia stato predisposto per riconoscerla e trattarla.

 

                Ad esempio per il video si puo' avere: la pulizia dello schermo, posizionamento diretto del cursore a riga e colonna volute, cambiamento dei colori di primo piano e di sfondo; per una stampante, invece, tipo e dimensione del carattere di stampa, lunghezza della pagina, numero di colonne per riga, ecc.

 

                Concludiamo l'esame sulla codifica dei caratteri con una osservazione sull'estensione della tabella, i cui posti disponibili sono 256, ma di essi solo la meta' possiede una codifica standardizzata.

 

                Cio' non significa che i rimanenti (valori da 128 a 255) siano inutilizzati, ma solo che ogni costruttore puo' adottare convenzioni sue proprie per la loro utilizzazione.

 

                Si hanno cosi' diverse scelte più o meno diffiusi; una e' quella di utilizzare lo 'spazio superiore' (quello in cui il primo bit e' posto uguale ad 1) per simboli grafici tipici di lingue diverse dall’inglese: caratteri accentati, tilde, dieresi, ecc. e per simboli propriamente 'grafici', quali linee continue, angoli, lettere dell'alfabeto greco e cosi' via.

 

                Una seconda scelta e', ad esempio, quella di un alfabeto alternativo completo in caratteri corsivi, o di altro tipo ancora.

 

                Poiche' i posti sono limitati non e' ovviamente possibile avere contemporaneamente la disponibilita' delle diverse scelte; la mancanza di uno standard unico per questo segmento di codici puo' generare problemi di portabilita' dei programmi applicativi. E' quindi opportuno fare uso di queste possibilita' in modo limitato ed in ambienti sicuramente ben controllabili.

 

                Ad esempio, in sistemi MS-DOS anche i posti 0 .. 31 della tabella ASCII sono stati utilizzati per rappresentare particolari caratteri grafici solo allo schermo; questo può essere fonte di problemi, specialmente con gli attuali programmi di videoscrittura.

 

 

 

 

 

 

                4.8 - Notazioni speciali per i tasti di controllo.

 

                Le tastiere hanno di norma un numero di tasti sufficiente per la rappresentazione dell'intera sequenza, detta dei caratteri stampabili (o rappresentabili) ASCII. Le varianti nazionali hanno pero' scelte di lettere accentate e simili, che sacrificano in genere un certo numero di simboli, i quali richiedono di conseguenza convenzioni speciali.

 

                Ci limitiamo a descrivere in dettagli il caso delle tastiere dei Personal Computer della ‘classe’ MS-DOS;i principi generali si applicano anche ad altri sistemi, con varianti che possono essere facilmente determinate consultando i loro manuali.

 

                Il numero di tasti è necessariamente limitato; a questo si supplisce moltiplicandone le funzioni con altri tasti in ruolo di modificatori, dei quali shift, comunemente detto ‘tasto delle maiuscole’ è l’esempio più familiare. Un modificatore è un tasto che in genere non ha alcun effetto se impiegato da solo, ma cambia il risultato ottenibile da un altro quando viene premuto contemporaneamente ad esso.

 

                Per i tasti alfabetici e' naturale l'associazione maiuscolo/minuscolo, mentre per gli altri shift permette di produrre quello dei due simboli riportati sul tasto che si trova piu' in alto.

 

                Dei codici di controllo ASCII 0 .. 31 alcuni sono ottenibili da un singolo tasto; per indicarli si utilizza sovente una notazione con parentesi acute, come:

 

  (4.8.1)   <ESC>                   <TAB>                  <CR>                     <BS>

 

notazione che viene spesso estesa anche ad altri tasti o loro combinazioni.

 

                Il secondo per importanza, tra i tasti modificatori, e' indicato in genere con <CTRL>, abbreviazione di 'controllo'; esso e' il mezzo piu' immediato per generare molti del valori della tabella (4.7.1).

 

                Anche <CTRL> deve essere premuto congiuntamente ad un altro tasto per avere effetto, cosa che puo' indicarsi ad esempio con:

 

  (4.8.2)   <CTRL>+<A>                     <CTRL>+<L>                     <CTRL>+<\> ,

 

ma e' piu' comune una notazione, in cui si premette il simbolo ‘^’ a quello del tasto interessato; per i casi (4.8.2), quindi:

 

  (4.8.3)   ^A,         ^L,         ^\ .

 

                L'effetto del tasto <CTRL> e' l'azzeramento dei due primi bit a sinistra nella codifica del byte corrispondente all'altro tasto, cioe' l’eliminazione della sesta e settima potenze del 2; il secondo valore non ha effetto per la tabella (4.6.1), ma il primo comporta per gli esempi (4.8.3):

 

  (4.8.4)   65 --> 1 , 76 --> 12 , 92 --> 28 .

 

                Esiste infine la possibilita' di assegnare il valore di un byte usando direttamente il suo contenuto numerico; le tastiere dei sistemi MS-DOS possiedono un tasto modificatore indicato con <ALT> ed un tastierino numerico separato dalla parte principale (alfabetica e di controllo); in altri sistemi si può avere, ad esmpio, un tasto apposito con l’indicazione composizione.

 

                Ogni valore ASCII può essere generato battendo il codice (decimale) sul tastierino numerico e tenendo contemporaneamente premuto <ALT>; questo e' anzi il solo modo di ottenere caratteri con codifica oltre 127, con l’eccezione delle possibili lettere di alfabeti nazionali.

 

                In quest’ultimo caso diviene necessario il ricorso al tastierino numerico per altri caratteri della sequenza principale; ad esempio i due caratteri ‘{‘ (ASCII 123) e ‘}’ (ASCII 125) non si possono ottenere in altro modo sulle tastiere nazionali italiane.

 

 

 

 

 

                Si può ancora menzionare la presenza sulla tastiera di una 'batteria' di tasti-funzione, con indicazioni speciali, come F1 .. Fn, che però non sono direttamente collegati ai caratteri di controllo, ad essi possono invece essere associate funzioni anche molto complesse, che debbono però essere definite dai programmi applicativi e sono quindi variabili con essi.

 

 

 

                4.9 - Sequenze di caratteri: STRINGHE.

 

 

                Il singolo byte, di capacità molto limitata, non è adatto alle esigenze dell’informazione numerica, ma è ben utilizzabile per quella simbolica, quale è appunto la rappresentazione dei caratteri, intesi nel senso ampio che include anche quelli di controlloo non rappresentabili; questi ultimi descrivono sempre azioni da eseguire, la cui natura non è però grafica.

 

                Più che  i singoli caratteri interessa però considerare le loro aggregazioni in sequenze; quelle che in un ordinario linguaggio formano parole, frasi, periodi e così via.

 

                Le sequenze ordinate di caratteri sono abbastanza importanti da essere indicate con un nome particolare:

 

    (4.9.1) Si dice stringa ogni sequenza finita di caratteri; la sua proprietà principale è la lunghezza.

 

                La rappresentazione naturale di una stringa in memoria è una sequenza contigua di byte; a partire da un certo indirizzo, o inizio della stringa, si ha il codice ASCII del primo carattere, poi del secondo, ecc..; se ad esempio la STRIGA è “ABC 123”, di lunghezza pari a 7, ed il inizio suo inizio è il byte 110, la posizione ed il contenuto di ogni byte sono:

 

     (4.9.2)                posizione              110         111         112         113         114         115         116

               carattere               ‘A’          ‘B’          ‘C’          ‘ ‘            ‘1’           ‘2’           ‘3’

               cod. ASCII            65           66           67           32           49           50           51

                esadecimale         41           42           43           20           31           32           33

 

                La seconda, terza e quarta riga sono modi diversi ed equivalenti di rappresentare la medesima informazione; potrebbero avere interesse anche le rappresentazioni binarie ed ottale.

 

                Si osservi che mentre per i caratteri si è finora utilizzata semza commento la notazione che rappresenta il simbolo del carattere racchiuso da una coppia di apici, per le stringhe si è invece fatto ricorso ai doppi apici.

 

                Questa è la convenzione più corrente, che in entrambi i casi viene utilizzata in funzione di ‘parentesi’ che iniziano e terminano l’informazione voluta; ciò impedisce però di rappresentare all’interno di una stringa il carattere””(ASCII 34), che richiede una diversa convenzione, sfortunatamentevariabile con il contesto in cui le stringhe sono trattate4.

 

                Le due notazioni sono diverse per rimarcare la diversa qualità: le stringhe hanno la natura di insiemi, i caratteri quella di singoli elementi e si deve distinguere tra un singolo carattere ed una stringa di lunghezza uno ridotta a quel solo carattere.

 

                La distinzione è importante anche dal punto di vista operativo: per la macchina esistono operazioni sensate (eseguibili) per ognuno dei contesti, che non lo sono invece per l’altro. Ad esempio, le stringhe possono venire concatenate (unite consecutivamente) tra loro, ma non possono essere oggetto di operazioni aritmetiche; per i caratteri la prima operazione è in ogni caso priva di senso, mentre le seconde sono possibili, almeno in certi contesti.

 

 

 

 

 

                La rappresentazione delle stringhe come sequenze di byte a partire da un indirizzo di memoria, pone il problema di come riconoscere la fine; ciò è importante, poichè la lunghezza è una proprietà essenziale di una stringa e se, ceme è necessario in certi casi, il contenuto della stringa può essere cambiato, la lunghezza può anche cambiare.

 

                Vi sono almeno due possibili soluzioni:

 

                - mantenere la lunghezza della stringa come informazione separata;

                -usare un carattere speciale per indicare che la stringa è finita.

 

                In alcuni linguaggi di programmazione (ad esempio il basic) si è fatta la prima scelta, che comporta due elementi fissi, l’indicazione dell’indirizzo del byte e della lunghezza, ed uno dinamico, la sequenza dei byte.

 

                In altri (ad esmpio il C) si è preferita la seconda alternativa, adottndo las convenzione detta ASCIZ, che richiede di aggiungere un byte di contenuto nullo, (nul), o ASCII 0, alla fine della riga, aumentando quindi di uno l’occupazione di memoria rispetto alla lunghezza ‘utile’.

 

                I dettagli su come queste informazioni vengano trattate sono materia specifica dei singoli linguaggi o sistemi oiperativi; in questa sede è sufficiente avere evidenziato i relativi problemi.

 

                E’ invece importante osservare che intuitivamente si tende ad identificare le stringhe con le parole costruitea partire da un alfabeto; più raramente con costruzione più complesse (frasi, pagine, ecc..). Questa interpretazione è appropriata, ma si deve ricordare che l’attuale ‘alfabeto’ è dato dalla codifica ASCII, normale (128 valori) o estesa (256), e che esso non si limita ai soli caratteri rappresentabili graficamente, ma comprende anche quelli che abbiamo definito di controllo.

 

                Non vi è infatti nulla nella definizione delle stringhe che impedisca di utilizzare il byte del secondo tipo; questo può non essere comune, o addirittura proibito, se lo scopo è la composizione di un testo leggibile, ma legittimo inun caso più generale.

 

                E’ in questo caso che l’importanza delle stringhe è molto grande: esse sono infatti abbastanza generali da potere rappresentare qualunque tipo di informazione; il limite non sta nella loro definizione, ma nelle restrizioni che ogni contesto particolare può imporre per la loro rappresentazione; ad esmpio, se si adotta la forma ASCIZ si dovranno stabilire convenzioni addizionali per accettare una stringa in cui uno dei caratteri è un byte nullo, oppure rinunciare a trattarle.


 [GB-CdC1]1 La difficolta maggiore è data dalla mancanza di familiarità con gli ‘alfabeti’ non decimali; il medesimo numero 19 si scrive 201 in base tre. Si provi a convertirlo in binario facendo uso esclusivamente della notazione ternaria, cioè delle cifre 0, 1, 2.

Dovendo affrontare conversioni di questo tipo è probabilmente più conveniente un passaggio intermedio, dalla prima base al decimale, quindi dal decimale alla seconda base.