DEV Community

Cover image for Big Endian e Little Endian
Victor Antunes
Victor Antunes

Posted on

Big Endian e Little Endian

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.

Nota do editor: mas assim nem eu entendi.

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

Desculpa, Jack Black. Você é massa e fez a sua parte com o filme de 2010, mas o filme de 1939 é um clássico.

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

Nessa disputa, eu tô do lado da briga.

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

O número é o mesmo. Só muda a representação.

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.

Top comments (0)