Olá, caro leitor! Para você que desenvolve firmware, além da programação é essencial conhecer as características do dispositivo que será utilizado, principalmente os relacionados à sua arquitetura. Segundo Stallings, a arquitetura define os atributos visíveis ao programador, por exemplo, o conjunto de instruções, a quantidade de bits usados para representação de dados, os mecanismos de E/S, as técnicas de endereçamento etc. Neste artigo será apresentado um conceito denominado Endiannes. Porém, antes de caracterizá-lo, é importante ter o fundamento de alguns conceitos relacionados à memória.
Memória
Grosso modo, uma memória pode ser definida como um conjunto de elementos que armazenam informação. Esses elementos são chamados de palavras, sendo cada palavra identificada de maneira unívoca a partir de um endereço, isto é, um endereço de memória! Uma característica da palavra é a sua capacidade de armazenar informação, isto é, a quantidade de bytes que a palavra representa.

Agora sabemos que uma memória é composta por palavras e que toda palavra possui um endereço único. Se considerarmos uma memória endereçada byte a byte, a declaração de uma variável (considere um sistema de 32 bits) do tipo inteiro ocuparia 4 bytes da memória, já um double, 8 bytes. Diante disso, consideramos como endereço de uma variável o endereço de menor valor na região ocupada.
Afinal, o que é Endiannes?
Esse termo está relacionado com a maneira em que uma informação é organizada na memória, isto é, da ordenação dos bytes. Na verdade, essa organização será importante para informações que são compostas por mais de um byte, por exemplo, uma variável inteira. Diante disso, o mesmo valor pode ser armazenado de forma diferente conforme a característica do hardware: Little-Endian ou Big-Endian.
Endiannes: Little-Endian e Big-Endian
Um exemplo simples e prático é mostrador a seguir. Considere que uma variável int x (4 bytes) recebe o valor 0x01234567. Conforme mostra a Figura 2, essa variável está localizada no endereço 1000.
No sistema Little-Endian os bytes são organizados de forma que o menor endereço ocupado pela variável armazena o byte menos significativo da informação. Nesse exemplo, o menor endereço é 1000 e o byte menos significativo é 0x67. Essa situação é ilustrada na Figura 3.
O oposto ocorre no sistema Big-Endian, isto é, o byte menos significativo é armazenado no maior endereço. Essa situação é ilustrada na Figura 4.

Dito de outra maneira, o formato Big-Endian corresponde à ordem natural na qual estamos acostumados a representar as informações. Cabe ressaltar que apenas a ordem dos bytes é alterada, não a dos bits! Para demonstrar essas diferenças, considere o código abaixo. Nesse código a union Endian é utilizada para acessar o mesmo endereço de formas diferentes, isto é, como um inteiro ou como um array de bytes do tamanho de um inteiro. Atribuindo o valor 1 a esse espaço de memória é possível verificar o endian de forma bem simples. Se o índice 0 do array contém o valor 1 o sistema é Little-Endian, caso contrário, será Big-Endian.
union Endian
{
unsigned int X;
unsigned char Array[sizeof(int)];
};
int main(void)
{
volatile union Endian Test;
Test.X = 1;
if(Test.Array[0] == 1)
{
//Little-Endian
}
else
{
//Big-Endian
}
}
Esse mesmo código foi compilado para as arquiteturas AVR8 (Little-Endian) e AVR32 (Big-Endian). Na Figura 5 é possível observar o primeiro byte com o valor 1, isto é, o byte menos significativo está no menor endereço.
Já na Figura 6 é possível observar o quarto byte com o valor 1, isto é, o byte menos significativo no maior endereço.
Fique de olho!
De modo geral, essa característica é transparente ao programador. Isso significa que a ordem dos bytes não tem influência nas operações realizadas como, por exemplo, nas instruções de movimentação de dados. No entanto, é necessário estar atento a isso quando uma comunicação entre dispositivos é realizada, ou quando um conjunto de dados formado em um sistema é manipulado por outro. Por exemplo, o protocolo TCP/IP é Big-Endian, já o protocolo USB é Little-Endian. Isso significa que ao enviar ou receber dados utilizando esses protocolos você deve converter as informações caso o formato do seu sistema seja diferente. Cabe ressaltar que algumas arquiteturas têm suporte para ambos os formatos, como o caso das arquiteturas ARM e MIPS.
Curiosidades
A origem desses dois termos vem do livro “As Viagens de Gulliver”, de Jonathan Swift. Eles se referem a uma guerra religiosa entre dois grupos, um que quebra ovos na ponta grande (big end) e outro que quebra ovos na ponta pequena (little end). Os termos foram aplicados na computação por Danny Cohen.
Conclusão
Neste artigo foi apresentado, de maneira introdutória, o conceito de ordenação de bytes conhecido como endiannes. As vantagens de desvantagens entre os dois métodos estão fora do escopo deste artigo. No entanto, é importante ficar atento ao datasheet do seu microcontrolador para conhecer mais sobre sua arquitetura e evitar problemas durante o desenvolvimento do firmware.
Referências
[1] – William Stallings. Arquitetura e Organização de Computadores 8ª Edição. [2] – Danny Cohen.Imagem destacada: https://pixabay.com/pt/espiral-escada-etapas-escadas-926736/















Simples e objetivo. Parabéns!
Obrigado!
A explicação mais clara sobre “endiannes” que já li! Excelente!
Olá, Ronaldo.
Obrigado pelo retorno!
Legal Garcia !!! Bom artigo!!! Como venho do 8080A sempre achei que o menos significativo vinha primeiro!!! Mas… enquanto se vive, se aprende!! Abraço
Muito obrigado, Ciro!