Lição
A teoria — Memória e bytes: ordem dos bytes, tipos e endereços
Um byte tem oito bits e representa um valor de 0 a 255. Cada endereço da memória guarda um byte. Um número que ocupa vários bytes usa endereços consecutivos: quatro, no caso de um inteiro de 32 bits. A ordem dos bytes determina a disposição desses bytes na memória. Em little-endian, o byte menos significativo fica no endereço mais baixo; em big-endian, fica aí o mais significativo. Lidos como inteiro sem sinal, quatro bytes dão b₀·256⁰ + b₁·256¹ + b₂·256² + b₃·256³, sendo bₖ o byte na posição k. Uma leitura com sinal subtrai 2³² quando essa soma é igual ou superior a 2³¹. Uma leitura em vírgula flutuante interpreta os mesmos bits segundo a norma IEEE 754.
O que significa cada símbolo
bₖ- o byte na posição k, de 0 (a menos significativa) a 3
256ᵏ- o seu valor posicional: 1, 256, 65 536 ou 16 777 216
- Pressupõe
- Os inteiros com sinal usam complemento de dois e os números de vírgula flutuante usam precisão simples IEEE 754, como em todos os processadores atuais de computadores pessoais e telemóveis. O texto usa ASCII, com um byte por carácter; UTF-8, usado hoje na maioria dos ficheiros, pode precisar de até quatro bytes para um carácter.
Problema resolvido na íntegra
-
Quais são as dimensões desta imagem? 4 passos
Carrega em Cabeçalho PNG. Estes são os primeiros 24 bytes de um ficheiro PNG. A especificação PNG estabelece que todos os inteiros que ocupem mais de um byte usam big-endian e que o bloco IHDR começa pela largura, seguida da altura, com quatro bytes para cada uma. Determina a largura e a altura e calcula as dimensões que obteria um programa que as lesse em little-endian.
Abrir este problema na ferramenta
-
O ficheiro começa com uma assinatura de oito bytes: 89 50 4E 47 0D 0A 1A 0A. Os quatro bytes seguintes indicam o comprimento do primeiro bloco, em big-endian: 00 00 00 0D vale 13. Segue-se o tipo do bloco, 49 48 44 52, que em texto é IHDR. Os dados do bloco começam, portanto, no endereço 16.
-
Largura, nos endereços de 16 a 19: 00 00 01 E0. Em big-endian, 01 ocupa a posição de valor 256¹ e E0, que vale 224, a posição de valor 256⁰: 256 + 224 = 480. A leitura no endereço 16 mostra esse mesmo resultado na ferramenta.
-
Altura, nos endereços de 20 a 23: 00 00 01 0E, ou seja, 256 + 14 = 270.
-
Em little-endian, o último byte passa a ser o mais significativo. A largura seria 224 × 256³ + 1 × 256² = 3 758 161 920 e a altura seria 14 × 256³ + 256² = 234 946 560.
Resposta
480 × 270 píxeis. Lidos em little-endian, os mesmos bytes indicam 3 758 161 920 × 234 946 560, cerca de 8,83 × 10¹⁷ píxeis. Com quatro bytes por píxel, isso corresponde a 3,53 × 10¹⁸ bytes. A ordem dos bytes é definida na especificação, sem estar assinalada no ficheiro; o programa precisa dessa informação para o ler.
-
Percurso de aprendizagem
Como um computador executa um programa
Referências (2)
- Where the names little-endian and big-endian come from, and the date the first insight gives: Danny Cohen, "On Holy Wars and a Plea for Peace." Internet Experiment Note IEN 137, 1 April 1980.
- The worked problem's file: the signature bytes, network byte order for every multi-byte integer, and the IHDR fields in order: W3C, "Portable Network Graphics (PNG) Specification (Third Edition)." W3C Recommendation, 24 June 2025.