Big Endian e Little Endian
Tags: computerscience
Published: 2021-01-12 16:04:51

#**Como eu vim parar aqui? Eu só tenho 6 anos.**
Pra quem já tentou (e falhou) em entender o que danado significa Big ou Little Endian, e que diferença isso faz: tamo aqui tentando explicar de forma fácil.

Extremidade ou Ordenação (em inglês, Endianness), é a forma de ordenação de uma sequência de bits. Basicamente, a ordenação diz se vamos escrever os bits da esquerda para a direita, ou da direita para a esquerda.

<small>**_Nota do editor: mas assim nem eu entendi._**</small>

Calma, confia. Primeiro bora se situar sobre a origem do termo Endian.

#**Endian? Mas que nome estranho.**
Deveras, né? Bom, tem um motivo pra isso. Pra quem leu ou assistiu As Viagens de Gulliver, provavelmente vai se lembrar disso. Pra quem não assistiu, assista depois de ler isso aqui, que é pra não perder a concentração.
![As Viagens de Gulliver, 1939](https://dev-to-uploads.s3.amazonaws.com/i/kpnxyz1s2rofneg5i15a.jpg)
<center><small>_Desculpa, Jack Black. Você é massa e fez a sua parte com o filme de 2010, mas o filme de 1939 é um clássico._</small></center>

Pra resumir a história, um belo dia o filho do imperador se cortou quebrando a casca de um ovo a partir do lado maior (_big end_). A partir de então, ficou determinado por lei que a única forma permitida de quebrar ovos seria pelo lado menor (_little end_). Obviamente, isso gerou um conflito armado com os defensores da prática tradicional de quebrar ovos a partir do lado maior.
![Egg Endianness](https://dev-to-uploads.s3.amazonaws.com/i/rlq9nr51hwvkg2fxs9h1.jpg)
<center><small>_Nessa disputa, eu tô do lado da briga._</small></center>

Eis que um rapaz chamado Danny Cohen, durante um paper técnico sobre ordenação de bits da década de 1980, usou a história de Gulliver para ilustrar seu ponto de vista. E pegou, e tá aí até hoje.


#**Beleza, agora pare de enrolar.**

Pois muito bem. 

Pra agilizar, bora logo estabelecer que o sistema numérico decimal que usamos no dia a dia é um exemplo de ordenação Big Endian.


Por exemplo, o número 1234 tem como número mais significativo o valor 1, responsável por representar a casa dos milhares, enquanto o número 2 representa a casa das centenas, e assim por diante, sendo o valor 4 o número menos significativo, responsável por representar a casa das unidades.

Pra representar o mesmo número 1234 em um sistema de ordenação Little Endian, precisamos inverter a ordem de escrita.
![1234 endiannes](https://dev-to-uploads.s3.amazonaws.com/i/a5f7mvlh9v381qf7m0u8.jpg)
<center><small>_O número é o mesmo. Só muda a representação._</small></center>

Ou seja, no modo Big Endian, o bit de maior valor (bit mais significativo) fica localizado à esquerda. No modo Little Endian ocorre o inverso, com os bits mais significativos sendo mantidos à direita.

#**Agora transformando isso em bits.**
Agora que tu já sabe fazer conta usando laranjas, bora fazer a mesma conta usando maçãs. Os exemplos a seguir serão todos representados usando a ordenação Big Endian, em palavras de 16 bits:

#####Representação do número decimal 1:
`0000 0000 0000 0001`

#####Representação do número decimal 5:
`0000 0000 0000 0101`

#####Representação do número decimal 500:
`0000 0001 1111 0100`

#####Representação do número decimal 32767:
`0111 1111 1111 1111`


#####Representação do número decimal 65535:
`1111 1111 1111 1111`

_p.s.: estamos usando bytes do tipo unsigned, que não utilizam um bit para designar valor positivo ou negativo._

Note como um valor ordenado em Big Endian começa a ser incrementado a partir do bit menos significativo localizado à direita, e conforme o número vai se tornando maior, os bits mais significativos à direita vão sendo preenchidos.

#**Tá, mas o que dá pra fazer com isso?**
Imagine que sua aplicação recebeu uma cadeia de bits, a qual você não faz ideia do que significa.

Tudo o que você sabe é:
- se trata de uma palavra de 16 bits;
- a ordenação é Little Endian;
- se trata de um número decimal inteiro;;

Não pergunte. O seu dia, o seu emprego e a nova Ferrari do seu chefe dependem disso. Não pestaneje, apenas me diga qual valor decimal temos nesses bits:

#####Número misterioso em ordenação Little Endian:
`0000 0000 0001 0000‬`

Beleza, Little Endian. Só que eu não sei converter de binário Little Endian pra decimal de cabeça. Eu só aprendi com Big Endian. E agora? 

Ora, aqui nesse mero post não temos nenhuma ferramenta de programação, não é mesmo? Não dá pra fazer uma chamada em alguma biblioteca que inverta a ordem dos meus bits. Então bora facilitar a conversão e utilizar um atalho: a gente inverte a ordem na mão:

#####Número misterioso em ordenação Big Endian:
`0000 1000 0000 0000`

Show, agora dá pra converter. Eu sei que isso aí dá **2048** em decimal.

Missão cumprida, Ferrari do CEO garantida. Vá tomar um bom café, dev. Você mereceu.

###**Mas e se eu não tivesse a informação sobre o tipo de ordenação? Eu ia ter que adivinhar ou chutar se era Little Endian ou Big Endian?**

Sim.


Espero ter ajudado.