Les nombres dans la machine

Little & big endian

Un nombre tient sur plusieurs octets. Reste une question toute bete, mais lourde de consequences : dans quel ordre les ranger ?

Le probleme : plusieurs octets, quel ordre ?

Un entier de 4 octets comme 305419896 s'ecrit en hexadecimal 12 34 56 78 (quatre octets). En memoire, ces quatre octets se suivent - mais on peut les ranger de deux facons :

Big endian : 12345678
Le gros bout (octet de poids fort) en premier - comme on ecrit les nombres a la main.
Little endian : 78563412
Le petit bout (octet de poids faible) en premier - l'ordre prefere des processeurs Intel/AMD et de la plupart des ARM.

C'est exactement la meme valeur : seul l'ordre de rangement change. Le processeur sait relire dans son propre ordre - le probleme arrive quand deux machines ne sont pas d'accord.

D'ou vient ce drole de nom ?

De Les voyages de Gulliver (Jonathan Swift, 1726) : a Lilliput, deux camps se font la guerre pour savoir par quel bout casser un oeuf a la coque - le gros bout (Big-Endians) ou le petit bout (Little-Endians). Les informaticiens ont repris la querelle, mot pour mot, pour l'ordre des octets. Une guerre de cent ans... pour un oeuf.

Demo : range un entier en memoire

Tape un entier (sur 4 octets, donc de 0 a 4 294 967 295). La machine te montre ses octets dans les deux ordres.

Big vs little endian

Pourquoi ca compte (et quand)

Tant qu'un nombre reste dans une seule machine, l'endianness est invisible : le processeur range et relit dans son propre ordre. Le piege apparait quand des octets voyagent :

Si on lit dans le mauvais ordre, 305419896 devient 2018915346 - une valeur absurde, sans aucune erreur visible. D'ou la regle : pour des donnees binaires, on precise toujours l'ordre.

import sys sys.byteorder # 'little' sur un PC ordinaire n = 305419896 n.to_bytes(4, "big") # b'\x12\x34\x56\x78' n.to_bytes(4, "little") # b'\x78\x56\x34\x12' # a la lecture, on indique le meme ordre : int.from_bytes(donnees, "big")

En Python, le module struct fait pareil : struct.pack(">i", n) pour big endian, "<i" pour little.

En resume

Big endianLittle endian
Ordregros bout d'abordpetit bout d'abord
Quireseau (Internet), anciens Mac, certains capteursIntel, AMD, la plupart des ARM
En Python"big" / ">""little" / "<"

→ Retour au decoupage des bits (IEEE 754), ou vois les catastrophes numeriques bien reelles.