Ordre des bits, ordre des bytes

Ordre des bits

Si nous avons une donnée représentée sur plusieurs bits, se pose le problème de la numérotation de ceux-ci. Comme tout bon informaticien, nous allons les numéroter de 0 à N-1. Il est naturel de considérer ces bits comme étant situés les uns à coté des autres et comme nous écrivons de gauche à droite, nous allons naturellement mettre le bit 0 à gauche et le bit N-1 à droite. Pour un nombre cela fait que le bit de poids le plus fort est numéroté 0 et le bit de poids faible numéroté N-1. Ce n'est pas très intuitif si on pense à la valeur de cet ensemble de bits comme étant bN-1 2N-1 + ... b0. La convention inverse, le bit de poids faible numéroté 0 et le bit de poids fort numéroté N-1, est donc aussi utilisé.

La première solution (le bit de poids fort numéro 0) est appelée ordre des bits grand boutiste (on rencontre aussi grand boutien, en anglais: big endian bit order), et l'autre ordre des bits petit boutiste (petit boutien, little endian bit order).

L'ordre des bits est essentiellement une affaire de convention et a peu de conséquences en pratique. La plus notable est que certaines instructions de certains processeurs supposent un ordre de bits donné (par exemple si une instruction qui donne le numéro du bit de poids le plus faible mis à 1 retourne 0, il faut savoir si le processeur a un ordre des bits petit boutiste ou grand boutiste pour interpréter le résultat).

Ordre des bytes

Si nous avons une donnée représentée sur plusieurs bytes, se pose le problème de la numérotation de ceux-ci. Comme tout bon informaticien, nous allons les numéroter de 0 à N-1. Il est naturel de considérer ces bytes comme étant situés les uns à coté des autres et comme nous écrivons de gauche à droite, nous allons naturellement mettre le byte 0 à gauche et le byte N-1 à droite. Pour un nombre cela fait que le byte de poids le plus fort est numéroté 0 et le byte de poids faible numéroté N-1. Ce n'est pas très intuitif si cette donnée représente un nombre et qu'on considère qu'un byte représente un chiffre dans la base adéquate. La convention inverse, le byte de poids faible numéroté 0 et le byte de poids fort numéroté N-1, est donc aussi utilisée.

La première solution (le byte de poids fort numéro 0) est appelée ordre des bytes grand boutiste (on rencontre aussi grand boutien, en anglais: big endian byte order), et l'autre ordre des bytes petit boutiste (petit boutien, little endian byte order).

L'ordre des bytes n'est pas qu'une affaire de convention. Dès qu'une valeur est décomposée en une suite de bytes il va intervenir avec des effets observables.

En mémoire, on va placer le byte numéroté 0 à une adresse inférieure à celle du byte numéroté N-1 et donc la mémoire sera difficilement partageable entre processeurs ayant des ordres de byte différents. D'accord, cette conséquence est annectodique mais si un programme accède à une valeur comme un nombre placé sur plusieurs bytes et comme à une suite de bytes, la différence est aussi détectable.

Si la mémoire est copiée dans un fichier directement, le fichier ne pourra être lu sans traitement particulier que par des ordinateurs ayant le même ordre.

Le même problème se pose dans les transferts par réseau. Dans ce cas, l'ordre est généralement imposé par les protocoles. L'ensemble des protocoles d'internet utilisent un ordre des bytes grand boutiste et appellent cet ordre network byte order (soit l'ordre des bytes du réseau).

La question pose donc pas mal de problèmes en pratique bien que quand on est au courant du problème il est facile d'écrire du code qui ne dépende pas de l'ordre des bytes.

Schizophrénie?

On pourrait s'attendre à ce qu'un processeur donné soit petit boutiste ou grand boutiste pour les bits comme pour les bytes. Ce n'est pas le cas. La palme dans le genre revient vraissemblablement à la famille 68000 de Motorola dont l'ordre des bytes est grand boutiste, l'ordre des bits est documenté comme petit boutiste mais où certaines instructions utilisent un ordre des bits grand boutiste.

De même, on pourrait s'attendre à ce que l'ordre des bytes soit petit boutiste ou grand boutiste mais que les autres ordres possibles ne soient pas utilisés. Cette attente est historiquement non justifiée.

Guerres de religion?

Les termes proviennent de Gulliver, l'oeuvre où Jonathan Swift caricature les guerres de religion en décrivant des factions portant les mêmes noms qui se battent au sujet du bout par lequel il fallait manger les oeufs.