“Giochiamo alla guerra termonucleare globale.”
(Dal film “War Games”) (Mohāndās Karamchand Gandhi, 1947)
Oggi rispondiamo a quella che è forse la più profonda e basilare domanda che l’essere umano si sia mai fatto:
“Può un errore di programmazione far diventare Gandhi un sanguinario cultore del plutonio?”
E se non vi siete mai fatti questa domanda, forse avreste dovuto.
Democrazia e aggressività
Siamo nel 1991 e il gioco Civilization viene rilasciato al pubblico. Si tratta di un gioco strategico, da molti considerato una pietra miliare, un punto di svolta per il genere.
Ma verrà ricordato da tutti per un errore: Gandhi e la sua incredibile passione per le armi nucleari.
All’inizio del gioco, il giocatore deve scegliere la civiltà che vorrà portare, attraverso i secoli, alla gloria. Ognuna di queste civiltà è guidata da una figura storica rilevante per quella società: Abraham Lincoln per gli Americani, Giulio Cesare per i Romani e il Mahatma Gandhi per gli Indiani.
Stando alle regole del gioco, ogni capo di stato ha un coefficiente di aggressività maggiore di zero che può variare a seconda delle azioni che si compiono. Gandhi, tra tutti i capi di stato, è quello con il coefficiente di aggressività più basso, ovvero 1.
Ad un certo punto del gioco però, viene data la possibilità di cambiare la forma di governo della propria nazione in “democrazia”.
Questa azione, oltre ad avere degli incredibili risvolti sociali del tipo
“Ehi, possiamo votare chi ci governa!”
(Un tizio greco, nel VI secolo a.C.)
fa anche calare di due punti il coefficiente di aggressività del proprio capo di stato.
Capirete, quindi, che se all’inizio del gioco avete scelto Gandhi, vi ritroverete con un capo di stato con aggressività -1.
E’ un problema?
Sì, parecchio.
War games
“Strano gioco [la guerra nucleare]. L’unica mossa vincente è non giocare.”
(Sempre dal film “War Games”).
Il problema sta nel fatto che nel codice del gioco il coefficiente di aggressività è stato salvato dagli sviluppatori in una variabile di tipo intero (ovvero senza virgola) a 8 bit senza segno.
Cosa vuol dire tutto ciò?
Le memorie dei computer sono organizzate in byte e suoi multipli. Tutti i dati che vengono immagazzinati nel nostro computer, dai file di testo, alle canzoni, ai numeri, vengono salvati sotto forma di byte.
In particolare l’unità fondamentale della memoria è il cosiddetto bit, un ottavo di byte.
Ora la domanda è: come vengono immagazzinati i numeri in un computer? La risposta è semplice e la conoscete tutti: in binario.
Già, ma come funziona il sistema binario? E soprattutto, come passiamo da un numero binario a uno nel sistema decimale?
Supponiamo – come per il coefficiente di aggressività – di avere 8 bit da riempire. Ciascun bit potrà contenere solamente 0 oppure 1.
Per convertire il numero binario in decimale, partendo dal bit più a destra, il contenuto di ciascun bit dovrà essere moltiplicato per 2b dove “b” è il numero del bit.
Nota a margine: in informatica (e in matematica) tutto è strano e masochista. Il numero dei bit si conta, quindi, a partire da zero. Quindi se abbiamo 8 bit, il valore “b” sopra sarà (0,1,2,3,4,5,6,7).
Sommando tutti i numeri così ottenuti, avremo la rappresentazione del nostro numero binario in formato decimale.
Chiaro?
Sono magnanimo e qui sotto vi metto una rappresentazione grafica di tutto ciò.
Prendiamo, per esempio, il numero binario 10100110. Usando la regola appena descritta vi renderete presto conto che questo è il numero 166 nel sistema decimale.
Capirete che, così facendo, il numero più piccolo che possiamo ottenere con 8 bit sarà quello con tutti i bit a 0 che ci darà:
0·20 + 0·21 + 0·22 + 0·23 + 0·24 + 0·25 + 0·26 + 0·27 = 0
mentre il numero massimo sarà quello con tutti i bit a 1, ovvero:
1·20 + 1·21 + 1·22 + 1·23 + 1·24 + 1·25 + 1·26 + 1·27 = 255.
Tornando al nostro amico Gandhi, abbiamo quindi che il coefficiente di aggressività, essendo salvato in una variabile intera a 8 bit senza segno, avrà come valore minimo 0 e massimo 255.
Democrazia e plutonio
E quando Gandhi passa ad avere un coefficiente di aggressività pari a -1 cosa succede?
Si rompe tutto. Ma perché?
Finora abbiamo parlato solamente di numeri senza segno, cosa succede quando cominciamo a trattare numeri che possono avere un segno, come i numeri negativi?
I moderni computer, per trattare i numeri con segno nel modo più efficiente possibile, usano un metodo chiamato complemento a due, che permette, dato un numero N di costruire il numero -N.
Le regole alla base di questo metodo sono estremamente semplici e ci dicono che:
- Il bit più a sinistra viene usato per indicare il segno: 0 per numeri positivi, 1 per numeri negativi
- Il valore assoluto del numero è dato dal contenuto dei restanti bit
- I numeri negativi sono ottenuti a partire dal numero senza segno, invertendo tutti i bit (gli 0 diventano 1 e viceversa) e aggiungendo 1 (in binario)
Sempre perché sono magnanimo nella figura qui sotto vi faccio vedere come ottenere il numero -1 a partire da 1.
Notato nulla?
Ebbene sì, cercando di scrivere in uno spazio di 8 bit il numero -1 otteniamo una sequenza di otto 1, ovvero la stessa sequenza che in una variabile senza segno corrisponde al valore 255.
Insomma, Gandhi, decidendo di rendere l’India una democrazia, ha perso due punti di aggressività, arrivando al valore di -1.
Questo valore, essendo salvato in una variabile senza segno, è stato però interpretato come tale e quindi con un valore di 255.
Di colpo il buon Gandhi si è ritrovato dall’essere la persona più buona e mite sulla faccia della Terra ad essere un capo di stato sanguinario, con un’inspiegabile passione per il plutonio.
Ma la volete sapere la cosa veramente triste di questa storia?
Nel suo libro Sid Meier’s Memoir! – A Life in Computer Games, Sid Meier, l’autore del videogame, ha affermato che in realtà questo bug non è mai esistito e che si è sempre trattato di una leggenda metropolitana.
Peccato vero? Sarebbe stata una storia meravigliosa da raccontare davanti ad una birra.
Perché raccontare questa storia quindi?
Si tratta di sicuro di un ottimo espediente per parlare del funzionamento dei computer e del sistema binario. E per quanto mi riguarda, di certo mi ricorderò per sempre che inserire un numero negativo in una variabile senza segno, può portare a risultati catastrofici.
Davide Laudicina
Laureato in Fisica Teorica all’Università di Milano-Bicocca, attualmente dottorando in fisica. Orgogliosamente Nerd, nel tempo libero ho sviluppato una dipendenza da serie TV, fumetti e libri e una malsana attitudine nel perdermi durante escursioni in montagna.
Approfondimenti:
- https://www3.ntu.edu.sg/home/ehchua/programming/java/datarepresentation.html
- https://en.wikipedia.org/wiki/Nuclear_Gandhi
Fonte di tutte le immagini: per gentile concessione dell’autore.