edubun
Italiano

Byte, esadecimale e testo

La lettera A è memorizzata come 65, cioè 01000001. In UTF-8 una sillaba coreana come U+D55C occupa tre byte.

Prima un indovinello quotidiano. (È un esempio inventato.) Uno studente scrive in chat la parola Korean, sei lettere. Un amico scrive la stessa parola in alfabeto coreano, che richiede tre sillabe. Quale messaggio è più grande? Probabilmente non quello che diresti. Salvate in UTF-8, le sei lettere inglesi sono 6 byte. Le tre sillabe coreane sono 9 byte, tre ciascuna. RFC 3629, lo standard che definisce UTF-8, usa proprio questa parola come uno dei suoi esempi e ne elenca i byte: ED 95 9C EA B5 AD EC 96 B4. Due cose spiegano la differenza. Serve un modo breve per scrivere i byte, e serve l'accordo che trasforma le lettere in numeri.

Due cifre esadecimali per ogni byte

Quelle coppie di lettere e cifre sono in esadecimale (in inglese hex). Le lunghe file di 0 e 1 sono difficili da leggere, quindi i programmatori usano questa abbreviazione. L'esadecimale ha sedici cifre: da 0 a 9, poi da A a F per i valori da dieci a quindici. Una cifra esadecimale copre esattamente quattro bit, quindi un byte è sempre due cifre esadecimali. Dividi 01000001 in 0100 e 0001. Sono 4 e 1, quindi il byte è 0x41, dove 0x dice solo «questo è esadecimale». In decimale vale 4 × 16 + 1 = 65.

Probabilmente hai già incontrato l'esadecimale senza accorgertene. I colori delle pagine web si scrivono spesso come #RRGGBB, un byte ciascuno per la luce rossa, verde e blu (MDN). #FF0000 è il rosso pieno: 255 nel primo byte, 0 negli altri due. #FFFFFF è il bianco. Il byte più grande, 11111111, è 0xFF, e 0xFF = 15 × 16 + 15 = 255.

A vale 65 perché tutti si sono messi d'accordo

Un computer non ha idea di che cosa sia una lettera. Memorizza un numero, e tutti si accordano in anticipo su quale numero indica quale lettera. L'accordo usato nelle prime reti era l'ASCII, e l'RFC 20 lo fissò per ARPANET nel 1969. L'ASCII usa 7 bit, quindi ha 128 codici. La A maiuscola è 65, la B è 66, e così via fino alla Z a 90. La a minuscola è 97. Sono esattamente 32 in più di A, una differenza di un solo bit. Anche le cifre sono codici. Il carattere 0 è 48, quindi il carattere «7» è memorizzato come 55, non come il numero 7.

Caricamento

Trascina per ruotare. Scorri o avvicina le dita per lo zoom.

Gli interruttori mostrano 01000001, la lettera A. Scegli un'altra lettera dal menu per vederne la sequenza, oppure cambia l'interruttore del 32 per passare tra maiuscole e minuscole.

Perché una sillaba coreana richiede tre byte

128 codici bastano e avanzano per l'inglese, ma sono lontanissimi dal bastare per coreano, arabo, cinese o emoji. Unicode dà a ogni carattere dei sistemi di scrittura del mondo un numero proprio, chiamato punto di codice, fino a U+10FFFF. UTF-8 (RFC 3629) è il modo più comune di trasformare quei numeri in byte, usando da uno a quattro byte per carattere. I 128 caratteri ASCII mantengono i loro vecchi codici di un byte, quindi un testo inglese semplice è identico in ASCII e in UTF-8. La tabella dell'RFC mette ogni punto di codice da U+0800 a U+FFFF nella riga dei tre byte, e le sillabe coreane stanno in quell'intervallo. Una é accentata occupa due byte, una sillaba coreana come U+D55C ne occupa tre e un'emoji come 😀 ne occupa quattro. Il primo byte annuncia perfino la lunghezza. ED è 11101101, e i suoi tre 1 iniziali dicono che questo carattere è lungo tre byte.

CaratterePunto di codiceByte UTF-8 (esadecimale)Byte
AU+0041411
aU+0061611
éU+00E9C3 A92
Sillaba coreana (U+D55C)U+D55CED 95 9C3
😀U+1F600F0 9F 98 804

Il testo illeggibile è fatto dei byte giusti letti con l'accordo sbagliato

Un file di testo semplice è solo questi byte in fila, nient'altro. La parola Hello salvata in UTF-8 è cinque byte: 48 65 6C 6C 6F in esadecimale, cioè 72, 101, 108, 108, 111 in decimale. Le due l sono lo stesso byte ripetuto. Ora apri quel file, o uno in coreano, con l'accordo sbagliato, per esempio una vecchia codifica coreana o giapponese invece di UTF-8. Il programma legge gli stessi identici byte come caratteri diversi. Nel file non c'è nulla di rotto, e riaprirlo come UTF-8 riporta il testo com'era.

Dove sono finiti i 34 GB mancanti

Dato che 2 alla 10 fa 1024, vicino a 1000, per molto tempo si è usato «kilobyte» per entrambi. Nel dicembre 1998 la IEC ha approvato nomi distinti, e il NIST li elenca: 1 kB è 1000 byte ma 1 KiB, un kibibyte, è 1024 byte; 1 MB è 1 000 000 byte ma 1 MiB è 1 048 576 byte. I produttori di dischi contano in potenze di dieci. Un disco venduto come 500 GB contiene 500 000 000 000 byte. Un sistema operativo che conta in potenze di due divide per 1 073 741 824 e mostra circa 465.66 GiB. I circa 34 che sembrano spariti non ci sono mai stati. I due numeri usano semplicemente unità diverse. La differenza cresce con l'unità: un KiB è più grande di un kB del 2.4%, un GiB è più grande di un GB di circa il 7.4%.

Errori comuni
  • «1 KB è esattamente 1000 byte ovunque.» Secondo lo standard, kB significa 1000 byte e 1024 byte sono un KiB. Nella pratica i vecchi nomi si usano ancora in entrambi i modi. Il NIST fa notare che i produttori di memorie di solito intendono 2²⁰ byte per un megabyte, mentre i produttori di dischi intendono 1 000 000, e che il vecchio floppy da «1.44 MB» usava un terzo megabyte di 1 024 000 byte. Quando conta la dimensione esatta, cerca la i: KiB, MiB, GiB.
  • «Il mio disco da 500 GB è arrivato con 34 GB in meno.» 500 000 000 000 byte ÷ 1 073 741 824 ≈ 465.66 GiB. Stessi byte, unità diversa. 500 − 465.66 ≈ 34.34, e quella differenza sono i 34 «mancanti».
  • «Un carattere occupa sempre un byte.» In UTF-8 vale solo per i 128 caratteri ASCII. é occupa 2 byte, una sillaba coreana 3 e 😀 4, quindi un limite contato in byte si riempie circa tre volte più in fretta con un testo coreano che con uno inglese.
  • «Il carattere 7 è memorizzato come il numero 7.» Il carattere «7» ha codice 55, cioè 00110111. Un programma che legge «7» da un testo deve trasformarlo nel numero 7 prima di poterci fare dei calcoli.
Nota per l'insegnanteParti dai byte sulla carta, non dalle definizioni. Scrivete Hello, cercate insieme i cinque codici in una tabella ASCII, e solo dopo mostra l'esadecimale. È nell'esadecimale che gli studenti si bloccano. Fai scrivere un byte come 8 bit, tracciare una linea a metà e trasformare ogni metà in una cifra, tenendo accanto un piccolo elenco 10 = A ... 15 = F. Vale la pena far notare la differenza di 32 tra A e a, perché cambiare un solo bit nella scena la fissa in testa. Se c'è un computer a portata di mano, salvate una riga in inglese e una in coreano come file di testo UTF-8 e confrontate le dimensioni.
  1. Quanto vale 0x41 in decimale?
  2. Quanto vale 0xFF in decimale?
  3. Quanti bit rappresenta una cifra esadecimale?
  4. In ASCII A è 65. Che numero è C?
  5. Di quanto è più grande il codice di a rispetto a quello di A?
  6. Quanti codici ha l'ASCII a 7 bit?
  7. Quanti byte occupa in UTF-8 la sillaba coreana U+D55C?
  8. Quale carattere è memorizzato come 01000010?
    • B
    • A
    • b
    • 2
  9. Quanti byte ci sono in 1 MiB?
  10. Un disco contiene 500 000 000 000 byte. Circa quanti GiB sono? (una cifra decimale)
Punti chiave
  • Una cifra esadecimale = 4 bit; un byte = due cifre esadecimali (da 0x00 a 0xFF).
  • ASCII: A = 65, a = 97, 0 = 48; 128 codici in 7 bit.
  • UTF-8 usa da 1 a 4 byte per carattere; il testo ASCII resta uguale.
  • 1 kB = 1000 B, 1 KiB = 1024 B; 1 MiB = 1 048 576 B.
Fonti di questo corso (9)
  • (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
  • Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
  • IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
  • IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
  • Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
  • Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
  • Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
  • abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
  • John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).

Consultato il: 2026-10-17