Mémoire et octets : boutisme, types et adresses

La mémoire contient un octet par adresse. Un nombre qui occupe plusieurs octets s'étend donc sur plusieurs adresses. C'est l'instruction de lecture qui détermine quels octets regrouper, dans quel ordre et selon quel type de nombre. Choisissez une lecture ci-dessous : les octets concernés s'allument, et le poids par lequel chacun est multiplié apparaît en dessous.

Chargement de la simulation interactive...

Leçon

La théorie — Mémoire et octets : boutisme, types et adresses

Un octet contient huit bits et représente une valeur de 0 à 255. Chaque adresse mémoire en contient un. Un nombre qui occupe plusieurs octets utilise des adresses consécutives : quatre pour un entier sur 32 bits. Le boutisme désigne l'ordre de ces octets. En ordre petit-boutiste, l'octet de poids faible se trouve à l'adresse la plus basse ; en ordre grand-boutiste, c'est l'octet de poids fort. Lus comme un entier non signé, quatre octets donnent b₀·256⁰ + b₁·256¹ + b₂·256² + b₃·256³, où bₖ est l'octet de rang k. Une lecture signée soustrait 2³² si cette somme est supérieure ou égale à 2³¹. Une lecture comme nombre flottant décode ces mêmes bits selon la norme IEEE 754.

Ce que signifie chaque symbole

bₖ
l'octet de rang k, de 0 (poids faible) à 3
256ᵏ
son poids : 1, 256, 65 536 ou 16 777 216
Suppose
Les entiers signés sont représentés en complément à deux et les nombres flottants au format IEEE 754 en simple précision, comme sur tous les processeurs actuels d'ordinateurs de bureau et de téléphones. Pour le texte, chaque caractère occupe un octet selon le codage ASCII. Le codage UTF-8, utilisé aujourd'hui par la plupart des fichiers, peut occuper jusqu'à quatre octets pour un seul caractère.

Dans le mauvais ordre, 1 devient 16 777 216 🖖

Cliquez sur 1 lu à l'envers. Un processeur x86, comme un processeur ARM dans la configuration utilisée par les téléphones, stocke l'entier 1 sur 32 bits en plaçant 01 à l'adresse la plus basse, suivi de trois octets nuls. C'est l'ordre petit-boutiste : l'octet de poids faible vient en premier. Une lecture grand-boutiste attribue au premier octet le poids le plus fort. Le même 01 vaut alors 256³, et le nombre devient 16 777 216, sans qu'aucun octet ait changé. Parmi les 4 294 967 296 valeurs possibles sur 32 bits, seules 65 536 se lisent de la même façon dans les deux ordres : celles dont le premier octet est identique au quatrième, et le deuxième au troisième. −1, soit FF FF FF FF, en fait partie. Danny Cohen a nommé ces deux ordres en 1980, en référence à la guerre racontée dans Les Voyages de Gulliver pour savoir par quel bout casser un œuf à la coque.

π et 1 078 530 011 correspondent aux mêmes quatre octets 🖖

Cliquez sur π lu comme un entier. Stocké comme un nombre flottant sur 32 bits, π est arrondi à la valeur représentable la plus proche, 3,14159274, et occupe les quatre octets DB 0F 49 40. Lisez-les comme un entier signé : vous obtenez 1 078 530 011. Inversez l'ordre des octets : le résultat devient −619 755 200. En lecture texte, ils donnent deux caractères, I et @, et deux octets non imprimables. Aucun de ces octets ne porte d'indication « nombre flottant ». Le Little Man Computer ne pouvait pas distinguer une instruction d'un nombre. De même, une mémoire d'octets ne permet pas de distinguer les types de nombres : le type est défini par l'instruction qui les lit. Un programme peut donc lire une valeur avec le mauvais type et obtenir un résultat erroné sans qu'aucune erreur soit signalée.

Une adresse de décalage suffit pour lire deux nombres positifs comme un nombre négatif 🖖

Cliquez sur Décalage d'une adresse. 1 000 se trouve à l'adresse 0 et 2 000 à l'adresse 4, tous deux en ordre petit-boutiste : E8 03 00 00 D0 07 00 00. Une lecture sur 32 bits qui commence à l'adresse 1 au lieu de 0 prend 03 00 00 dans le premier nombre et D0 dans le second. D0 occupe alors la position de poids fort : 3 + 208 × 256³ = 3 489 660 931. Une lecture comme entier signé donne −805 306 365, car le bit de poids fort de D0 est activé. Le résultat ne correspond à aucun des deux nombres stockés ; rien dans la mémoire n'indiquait où le premier se terminait.

Problème entièrement résolu

  1. Quelles sont les dimensions de cette image ? 4 étapes

    Cliquez sur En-tête PNG. Vous voyez les 24 premiers octets d'un fichier PNG. La spécification PNG impose l'ordre grand-boutiste pour tout entier qui occupe plus d'un octet. Elle précise aussi que le bloc IHDR commence par la largeur, puis la hauteur, chacune sur quatre octets. Trouvez ces dimensions, puis calculez celles qu'obtiendrait un programme en les lisant dans l'ordre petit-boutiste.

    Ouvrez ce problème dans l'outil

    1. Le fichier commence par une signature de huit octets : 89 50 4E 47 0D 0A 1A 0A. Les quatre octets suivants indiquent la longueur du premier bloc en ordre grand-boutiste : 00 00 00 0D vaut 13. Vient ensuite son type, 49 48 44 52, qui se lit IHDR en texte. Les données du bloc commencent donc à l'adresse 16.

    2. La largeur occupe les adresses 16 à 19 : 00 00 01 E0. En ordre grand-boutiste, 01 reçoit le poids 256¹ et E0, soit 224, le poids 256⁰ : 256 + 224 = 480. La lecture à l'adresse 16 dans l'outil donne le même résultat.

    3. La hauteur occupe les adresses 20 à 23 : 00 00 01 0E, soit 256 + 14 = 270.

    4. En ordre petit-boutiste, le dernier octet reçoit le poids le plus fort. La largeur donnerait 224 × 256³ + 1 × 256² = 3 758 161 920 et la hauteur, 14 × 256³ + 256² = 234 946 560.

    Réponse

    480 × 270 pixels. Lus en ordre petit-boutiste, les mêmes octets donnent 3 758 161 920 × 234 946 560, soit environ 8,83 × 10¹⁷ pixels. À raison de quatre octets par pixel, cela représente 3,53 × 10¹⁸ octets. L'ordre des octets est défini par la spécification, sans être indiqué dans le fichier ; le programme doit donc le connaître.

Parcours

Comment un ordinateur exécute un programme

Références (2)