edubun
Português

Bytes, hexadecimal e texto

A letra A é guardada como 65, ou 01000001. Em UTF-8, uma sílaba coreana como U+D55C ocupa três bytes.

Primeiro, um enigma do dia a dia. (Este é um exemplo inventado.) Um aluno digita a palavra Korean num chat, seis letras. Um amigo digita a mesma palavra na escrita coreana, que usa três sílabas. Qual mensagem é maior? Provavelmente não a que você imaginaria. Salvas em UTF-8, as seis letras inglesas ocupam 6 bytes. As três sílabas coreanas ocupam 9 bytes, três cada uma. A RFC 3629, a norma que define o UTF-8, usa exatamente essa palavra como um de seus exemplos e lista os bytes: ED 95 9C EA B5 AD EC 96 B4. Duas coisas explicam a diferença. Você precisa de um jeito curto de escrever bytes e precisa do acordo que transforma letras em números.

Dois dígitos hexadecimais para cada byte

Esses pares de letras e algarismos são o sistema hexadecimal, ou hex. Longas fileiras de 0s e 1s são difíceis de ler, então os programadores usam essa forma abreviada. O hex tem dezesseis dígitos: de 0 a 9 e depois de A a F para dez a quinze. Um dígito hex cobre exatamente quatro bits, então um byte é sempre dois dígitos hex. Divida 01000001 em 0100 e 0001. Esses são 4 e 1, então o byte é 0x41, em que 0x só avisa “isto é hex”. Em decimal é 4 × 16 + 1 = 65.

Você provavelmente já viu hex sem perceber. As cores em páginas da web costumam ser escritas como #RRGGBB, um byte para a luz vermelha, um para a verde e um para a azul (MDN). #FF0000 é vermelho total: 255 no primeiro byte e 0 nos outros dois. #FFFFFF é branco. O maior byte, 11111111, é 0xFF, e 0xFF = 15 × 16 + 15 = 255.

A é 65 porque todo mundo combinou que seria

Um computador não faz ideia do que é uma letra. Ele guarda um número, e todos combinam antes qual número representa qual letra. O acordo usado nas primeiras redes foi o ASCII, e a RFC 20 o definiu para a ARPANET em 1969. O ASCII usa 7 bits, então tem 128 códigos. O A maiúsculo é 65, o B é 66, e assim por diante até o Z, em 90. O a minúsculo é 97. Isso é exatamente 32 a mais que o A, uma diferença de um único bit. Os algarismos também são códigos. O caractere 0 é 48, então o caractere “7” é guardado como 55, e não como o número 7.

Carregando

Arraste para girar. Role ou faça pinça para dar zoom.

As chaves mostram 01000001, a letra A. Escolha outra letra no menu para ver o padrão dela, ou inverta a chave 32 para alternar entre maiúscula e minúscula.

Por que uma sílaba coreana precisa de três bytes

128 códigos bastam para o inglês e ficam muito longe do necessário para coreano, árabe, chinês ou emoji. O Unicode dá a cada caractere dos sistemas de escrita do mundo um número próprio, chamado ponto de código, até U+10FFFF. O UTF-8 (RFC 3629) é o jeito mais comum de transformar esses números em bytes, usando de um a quatro bytes por caractere. Os 128 caracteres ASCII mantêm os antigos códigos de um byte, então um texto simples em inglês é idêntico em ASCII e em UTF-8. A tabela da RFC põe todos os pontos de código de U+0800 a U+FFFF na linha de três bytes, e as sílabas coreanas ficam nessa faixa. Um é acentuado ocupa dois bytes, uma sílaba coreana como U+D55C ocupa três, e um emoji como 😀 ocupa quatro. O primeiro byte até anuncia o tamanho. ED é 11101101, e seus três 1s iniciais dizem que esse caractere tem três bytes.

CaracterePonto de códigoBytes UTF-8 (hex)Bytes
AU+0041411
aU+0061611
éU+00E9C3 A92
Sílaba coreana (U+D55C)U+D55CED 95 9C3
😀U+1F600F0 9F 98 804

Texto embaralhado são os bytes certos lidos com o acordo errado

Um arquivo de texto simples é só esses bytes em sequência, nada mais. A palavra Hello salva em UTF-8 ocupa cinco bytes: 48 65 6C 6C 6F em hex, ou 72, 101, 108, 108, 111 em decimal. Os dois l são o mesmo byte duas vezes. Agora abra esse arquivo, ou um em coreano, com o acordo errado, por exemplo uma codificação antiga coreana ou japonesa em vez de UTF-8. O programa lê exatamente os mesmos bytes como caracteres diferentes. Nada no arquivo está estragado, e abri-lo de novo como UTF-8 traz o texto de volta.

Para onde foram os 34 GB que faltam

Como 2 elevado a 10 é 1024, perto de 1000, por muito tempo se usou “quilobyte” para os dois. Em dezembro de 1998 a IEC aprovou nomes separados, e o NIST os lista: 1 kB são 1000 bytes, mas 1 KiB, um kibibyte, são 1024 bytes; 1 MB são 1 000 000 de bytes, mas 1 MiB são 1 048 576 bytes. Os fabricantes de discos contam em potências de dez. Um disco vendido como de 500 GB guarda 500 000 000 000 de bytes. Um sistema operacional que conta em potências de dois divide por 1 073 741 824 e mostra cerca de 465.66 GiB. Os cerca de 34 que parecem ter sumido nunca estiveram lá. Os dois números só usam unidades diferentes. A diferença cresce com a unidade: um KiB é 2.4% maior que um kB, e um GiB, cerca de 7.4% maior que um GB.

Erros comuns
  • “1 KB é exatamente 1000 bytes em qualquer lugar.” Pela norma, kB quer dizer 1000 bytes, e 1024 bytes são um KiB. Na prática, os nomes antigos ainda são usados dos dois jeitos. O NIST observa que os fabricantes de memória costumam chamar de megabyte 2²⁰ bytes, enquanto os de armazenamento querem dizer 1 000 000, e que o antigo disquete de “1.44 MB” usava um terceiro megabyte, de 1 024 000 bytes. Quando o tamanho exato importa, procure o i: KiB, MiB, GiB.
  • “Meu disco de 500 GB chegou com 34 GB faltando.” 500 000 000 000 bytes ÷ 1 073 741 824 ≈ 465.66 GiB. Mesmos bytes, unidade diferente. 500 − 465.66 ≈ 34.34, e essa diferença são os 34 “que faltam”.
  • “Um caractere é sempre um byte.” Em UTF-8 isso vale só para os 128 caracteres ASCII. é ocupa 2 bytes, uma sílaba coreana 3 e 😀 4, então um limite contado em bytes enche cerca de três vezes mais rápido com texto em coreano do que com texto em inglês.
  • “O caractere 7 é guardado como o número 7.” O caractere “7” é o código 55, ou 00110111. Um programa que lê “7” de um texto precisa transformá-lo no número 7 antes de fazer contas com ele.
Nota do professorComece com bytes no papel, não com definições. Escreva Hello, procurem juntos os cinco códigos numa tabela ASCII e só então mostre o hex. O hex é onde os alunos empacam. Peça que escrevam um byte como 8 bits, tracem uma linha no meio e transformem cada metade num dígito, com uma listinha 10 = A ... 15 = F ao lado. Vale destacar os 32 entre A e a, porque inverter um bit na cena faz isso ficar na memória. Se houver um computador à mão, salvem uma linha em inglês e uma em coreano como arquivos de texto UTF-8 e comparem os tamanhos.
  1. Quanto é 0x41 em decimal?
  2. Quanto é 0xFF em decimal?
  3. Quantos bits um dígito hex representa?
  4. A é 65 em ASCII. Que número é o C?
  5. Quanto o código de a é maior que o código de A?
  6. Quantos códigos tem o ASCII de 7 bits?
  7. Quantos bytes a sílaba coreana U+D55C ocupa em UTF-8?
  8. Qual caractere é guardado como 01000010?
    • B
    • A
    • b
    • 2
  9. Quantos bytes há em 1 MiB?
  10. Um disco guarda 500 000 000 000 de bytes. Isso é cerca de quantos GiB? (uma casa decimal)
Pontos-chave
  • Um dígito hex = 4 bits; um byte = dois dígitos hex (0x00 a 0xFF).
  • ASCII: A = 65, a = 97, 0 = 48; 128 códigos em 7 bits.
  • O UTF-8 usa de 1 a 4 bytes por caractere; texto ASCII fica igual.
  • 1 kB = 1000 B, 1 KiB = 1024 B; 1 MiB = 1 048 576 B.
Fontes deste curso (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).

Data de verificação: 2026-10-17