← Retour au chapitre

Fiche à trous · Première · NSI

Représentation des données — Binaire et hexadécimal

Complétez de mémoire, puis vérifiez avec la page de corrigé.

Additionnez 0,1 et 0,2 dans n'importe quel langage : le résultat n'est pas 0,3. Ce n'est ni un bug ni une imprécision de la machine, c'est une conséquence directe de la base 2. Comprendre pourquoi évite l'une des erreurs les plus tenaces de la programmation débutante.

Compter en base 2

DéfinitionBinaire :

2

Exemple

Combien de valeurs différentes un octet peut-il représenter ?

  1. 3.
  2. 4.
  3. 5.

Résultat :

DéfinitionHexadécimal :

8

Les entiers négatifs

Règle

10

Cette plage explique les débordements : ajouter 1 à la plus grande valeur représentable ne donne pas la valeur suivante mais la plus petite, le compteur repartant à l'autre extrémité. Un programme qui ne vérifie pas ses bornes produit alors un résultat parfaitement déterministe et parfaitement faux — c'est l'origine de nombreux incidents célèbres.

Coder les caractères

Propriété

D'où une conséquence pratique constante : la longueur en caractères d'une chaîne et sa taille en octets ne coïncident pas. Compter l'un pour l'autre produit des chaînes tronquées au milieu d'un caractère, et c'est l'origine des caractères illisibles qu'on voit encore apparaître dans certains logiciels.

Les nombres à virgule

Règle

Piège

Tester l'égalité de deux nombres flottants avec un opérateur d'égalité stricte, et s'étonner que la somme de 0,1 et 0,2 ne vaille pas 0,3.

Sur des flottants, comparer un écart à un seuil, jamais deux valeurs.

Convertir un nombre entre bases

  1. 13.
  2. 14.
  3. 15.
  4. 16.
  5. 17.
  • Ai-je vérifié la base de départ avant de convertir ?
  • Mes puissances de 2 sont-elles comptées de droite à gauche à partir de 0 ?
  • Pour passer du binaire à l'hexadécimal, ai-je regroupé par quatre bits ?
  • En complément à 2, ai-je donné au bit de poids fort une valeur négative ?
  • Ai-je distingué longueur en caractères et taille en octets en UTF-8 ?
  • Ai-je comparé mes flottants à une tolérance près ?

Corrigé · à détacher

Représentation des données — Binaire et hexadécimal

  1. 1. Le binaire est la numération en base 2 : chaque chiffre, appelé bit, vaut 0 ou 1, et chaque position vaut une puissance de 2 croissante de droite à gauche. Un octet est un groupe de 8 bits. Convertir du binaire vers le décimal consiste à additionner les puissances de 2 correspondant aux bits à 1.
  2. 2.
  3. 3. Chaque bit prend 2 valeurs, et les 8 bits sont indépendants.
  4. 4. Le nombre de combinaisons est donc le produit :
  5. 5. Soit 256 valeurs — de 0 à 255 pour des entiers non signés.
  6. 6. 256 valeurs
  7. 7. L'hexadécimal est la base 16, qui emploie les chiffres 0 à 9 puis les lettres A à F pour 10 à 15. Son intérêt est pratique : un chiffre hexadécimal correspond exactement à quatre bits, et un octet s'écrit donc avec deux chiffres. C'est pourquoi on l'emploie pour les couleurs, les adresses mémoire et les octets bruts — il abrège le binaire sans en trahir la structure.
  8. 8.
  9. 9. La représentation en complément à 2 permet de coder les entiers négatifs sans signe séparé. Le bit de poids fort vaut alors une puissance négative : sur 8 bits, il vaut −128, et les sept autres gardent leurs valeurs positives. L'intérêt est décisif : l'addition fonctionne sans cas particulier, le même circuit additionne des nombres positifs et négatifs. Sur 8 bits, on représente ainsi les entiers de −128 à 127.
  10. 10.
  11. 11. La table ASCII associe un code à chaque caractère de l'alphabet latin non accentué, sur 7 bits, soit 128 caractères. Elle ne suffit évidemment pas aux autres écritures. UTF-8 résout le problème par un codage de longueur variable : les caractères ASCII y gardent leur code sur un octet — ce qui assure la compatibilité —, et les autres en occupent deux, trois ou quatre. Un texte accentué occupe donc plus d'octets que de caractères.
  12. 12. Un flottant est codé selon la norme IEEE 754 : un signe, un exposant et une mantisse, sur un nombre fini de bits. Or un nombre décimal aussi simple que 0,1 n'a pas d'écriture finie en base 2, exactement comme un tiers n'en a pas en base 10. Le flottant n'en stocke donc qu'une approximation, et les erreurs s'accumulent au fil des calculs.
  13. 13. Identifier la base de départ et la base d'arrivée avant toute chose.
  14. 14. Vers le décimal : additionner chaque chiffre multiplié par la puissance de la base correspondant à sa position.
  15. 15. Depuis le décimal : diviser successivement par la base et lire les restes de bas en haut.
  16. 16. Entre binaire et hexadécimal : regrouper les bits par quatre, aucune division n'est nécessaire.
  17. 17. Vérifier l'ordre de grandeur : un octet ne dépasse pas 255 en non signé.