Número 90
17 de abril de 2024

Little endian, big endian

No libro “As Viaxes de Gulliver” de Jonathan Swift, o rei de Liliput decretou a obrigatoriedade de comer os ovos cocidos comezando polo cabo pequeno (“the little end”). A maioría dos súbditos aceptouno, pero houbo grupos de resistentes que persistiron en comer os ovos da maneira tradicional (comezando polo cabo grande, “the big end”). O rei tomou isto como unha afronta e reprimiu a esta xente, e esa represión resultou en rebelión.

Un ovo con letreiros que din “Little end” e “Big end”

O país veciño, inimigo ancestral de Liliput, aproveitou a situación para crear o caos dando apoio e recursos ao bando “Big Endian” para avivar a rebelión, causando guerras e grande sufrimento.

Na informática e nas telecomunicacións tamén temos un bando “Little Endian” enfrontado aos “Big Endian”. Non chegou a haber unha guerra por mor disto, pero si houbo enfrontamentos, erros de programación e longas disputas por Internet entre xente que non tiña nada mellor no que ocupar o seu tempo.

Na maioría dos países úsase o sistema arábico de escritura de números, no que temos dez díxitos entre 0 e 9 e a posición de cada díxito indica o valor que achega ao número. Por exemplo, no número 1234, o primeiro díxito, “1”, representa o valor “1000” e o derradeiro, “4”, representa o valor “4”. Ao díxito que está na posición que achega máis valor chamámolo o “díxito máis significativo” e ao da posición de menos valor, “díxito menos significativo”. No noso sistema comezamos a escribir os números polo díxito máis significativo.

Os ordenadores non usan o sistema arábico para escribir os números, senón que usan un sistema binario no que os bits van agrupados en bytes de 8 bits, que é a unidade mínima de almacenamento. Polo tanto, cando un ordenador ten que gardar un valor de 32 ou 64 bits na memoria, ten que dividilo en 4 ou 8 bytes. A cuestión é: un ordenador garda primeiro o byte máis significativo ou o menos significativo?

As arquitecturas “big endian” fan coma nós: poñen primeiro o byte máis significativo. Por exemplo, o valor hexadecimal “1234CAFE” vai gardado nestes bytes, en orde: “12”, “34”, “CA”, “FE”. O mesmo valor, nunha arquitectura “little endian”, iría gardado na orde contraria: “FE”, “CA”, “34”, “12”.

Os partidarios do “big endian” din que os sistemas “little endian” gardan os números ao revés. Pode ser, pero o certo é que non hai grandes vantaxes técnicas dun sistema sobre o outro. O sistema “big endian” pode ser máis natural de ler para un humano, pero o “little endian” facilita certas manipulacións de bits e de números.

“Bolsón Pechado” de “O Señor dos Aneis”, cun letreiro que di “Bag End”. Un teatro do “West End” de Londres.

As discusións entre os dous bandos eran moito máis intensas hai un par de décadas, cando os PC usaban Intel (“little endian”) e os Mac usaban Motorola ou PowerPC (“big endian”). Cando Mac mudou a Intel tamén mudou a “little endian” e ficou así cando mudou a ARM. (Os procesadores ARM pódense configurar para que funcionen en calquera orientación, pero penso que a maioría dos integradores escollen “little endian”).

Durante esta época era necesario ter coidado coa orde dos bytes cando se trasladaban ficheiros entre un sistema “big endian” e un “little endian”: algúns formatos especificaban a orde que usaban internamente, pero en moitos formatos a orde depende do sistema que gardou o ficheiro. Ninguén se salvaba: incluso un ficheiro de texto codificado con UTF-16 podía ser “little endian” ou “big endian”, así que eses ficheiros incluían un código especial que indicaba a orde dos bytes. (UTF-8 vai byte a byte, así que non ten ese problema).

Hoxe case todos os ordenadores persoais, tablets e teléfonos usan “little endian” así que é menos habitual atopar eses problemas no uso diario, pero os programadores aínda temos que ter a orde dos bytes en conta, especialmente se traballamos con hardware ou nas telecomunicacións.

Moitos sistemas de transmisión dixital traballan bit a bit, non byte a byte; polo tanto, para transmitir un byte hai que transmitir os bits nunha orde determinada, o que significa que tamén vai haber sistemas “little endian” e “big endian”. Se non ledes ben a documentación deles, ides levar sorpresas.

Hai tempo, eu estaba a facer un programa para un dispositivo USB. USB é “little endian”, pero o meu dispositivo tiña un compoñente “big endian”, así que os datos que ese compoñente enviaba chegaban cos bits postos ao revés.

Outra vez tiven que ler números de 12 bits que viñan empaquetados en bytes (un byte tiña 8 bits do primeiro número e o seguinte byte tiña os 4 bits restantes máis 4 do seguinte número, e o terceiro byte tiña os outros 8 bits). Unha das preguntas que tiven que facer para resolver este problema era en que orden viñan os bits.

Como xa dixen, a maioría das plataformas que ides usar ou programar nestes días é “little endian”, pero aínda é conveniente saber a orde dos bytes e dos bits para que, cando vos chegue un número “do revés”, saibades por que ocorreu.


Parágrafo extra: algúns ordenadores, como o famoso PDP-11, gardaban os números de 32 bits cunha orde mixta, dividíndoos en dous números de 16 bits “little endian” pero poñendo o número máis significativo primeiro. Como isto non é puro “little endian” ou “big endian”, algúns chistosos deron en chamar a este sistema “middle endian”.

Un letreiro que di “The End”