Hexadécimal

De T.R.A.F - Wiki
Aller à : navigation, rechercher

On entend souvent parler du système "hexadécimal" quand il s'agit d'informatique. Cependant, le néophyte a souvent du mal à comprendre réellement de quoi il s'agit. Le but de cette annexe est de dégrossir ce qu'est le système hexadécimal.


Introduction

Avant toute chose, voici la définition d'un terme que je vais très souvent utiliser dans ce document, la base :

 Une base est, mathématiquement, une valeur dont les puissances successives permettent l'écriture de nombres.

Prenons le système de comptage le plus simple qui est en base 10 : intuitivement, depuis que nous avons appris les nombres à l'école, nous comptons de la manière suivante, 0 1 2 3 4 5 6 7 8 9, puis nous passons à une dizaine que l'on incrémente de la même manière, 10 20 30 40 50 60 70 80 90, pour ensuite passez aux centaines, puis aux milliers, etc.

Pour illustrer ces quelques lignes, voici un petit exemple. Dans le système en base 10, nous avons tous appris qu'un nombre pouvait s'écrire comme la somme de 'facteurs multipliés par des puissances de 10'. Ce qu'on apprend à 8 ans donne ceci :

  2869 = 2×1000 + 8×100 + 6×10 + 9

Soit, en puissances de 10 (lorsqu'on est un peu plus âgé) :

  2869 = 2×103 + 8×102 + 6×101 + 9×100

Une petite remarque X0 (avec X différent de 0) vaut toujours 1. Si on le note, c'est pour que les gens puissent se repérer par rapport à ce qu'ils ont appris et par rapport aux écritures que nous allons employer. En effet, on dit que le chiffre le plus à droite est "d'ordre" 0, puis, de la droite vers la gauche, d'ordre 1, d'ordre 2, etc. Ces ordres sont les nombres qui se retrouvent en tant que puissance : 100 se situe donc à l'ordre 0, 101 à l'ordre 1, etc.

Le système hexadécimal

Le système hexadécimal, "comme son nom l'indique", compte en base 16 (hexadeci = 16 en grec), soit 0 1 2 3 4 5 6 7 8 9 A B C D E F (les lettres sont utilisées comme des symboles permettant de compter au-delà de 9 tout en s'écrivant avec un seul caractère). Lorsqu'on en a fini avec les unités, on passe au "seizaines" que l'on incrémente de la même manière 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0, puis on passe à l'ordre supérieur, de 100 à F00, puis encore à l'ordre supérieur, de 1000 à F000, etc.

L'hexadécimal est juste une technique de comptage dans une "autre base" que celle que nous utilisons tous les jours : en effet, si nous avions eu 16 doigts, ce serait probablement celle que nous aurions utilisée ! Rappelez-vous que les bases ne sont qu'un artifice mathématique bien pratique dans tout un tas de domaines !

Décomposition en puissances

Reprenons notre décomposition décimale en puissance de 10 (ça fait un peu pléonasme). L'hexadécimal utilise rigoureusement le même système. Par exemple :

  E8C1 = 14×163 + 8×162 + 12×161 + 1×160

Remarque : nous n'allions évidemment pas écrire E*163 ou C×161. Cela aurait paru absurde et abstrait, non ? Comme il a été dit plus haut, ces lettres sont des artifices mathématiques (normalisés) pour écrire un nombre de deux chiffres en un seul caractère pour tout ce qui va au-delà de 9 (jusqu'à 15).

Simple, n'est-ce pas ? On se rend alors compte qu'il est très aisé de passer de la base hexadécimale à la base décimale : il suffit d'additionner les différentes décompositions en puissances de 16 :

  14×163 + 8×162 + 12×161 + 1×160 = 59 585

Donc, E8C1 en hexadécimal vaut 59 585 en décimal.

Obtenir un nombre hexadécimal à partir d'un nombre décimal

La conversion de la base décimale à la base hexadécimale est un peu plus compliquée mais fait appel à des principes que vous avez déjà vus dans votre jeunesse. Pour ceux qui se posent des questions, voici un principe que vous devez ne pas avoir oublié. On vous a appris en CE1 qu'un nombre entier X pouvait s'écrire sous la forme :

 X = d×q + r

avec X, d, q et r des nombres entiers (sans virgule) positifs :

  • X le nombre recherché
  • d le dividende
  • q le quotient
  • r le reste de la division.


Prenons donc un cas simple. En base 10, si vous vous rappelez bien, on divisait successivement un nombre par 10 (qui devient alors le dividende) jusqu'à ce qu'il n'y ait plus qu'un nombre inférieur à 1, afin de connaître ses unité, dizaine, centaine, millier, dizaine de millier, etc. Reprenons notre exemple :

  2869/10 = 286,9  -->  le quotient est 286, il reste 9
  286/10  = 28,6   -->  le quotient est 28,  il reste 6
  28/10   = 2,8    -->  le quotient est 2,   il reste 8
  2/10    = 0,2    -->  le quotient est 0,   il reste 2

A présent, lisez les restes de bas en haut et vous obtenez... 2869 ! Moralité : c'est avec les 'restes' qu'on fait les meilleurs pots, euh, qu'on fabrique le nombres. Bien sûr, il n'y a aucun intérêt à convertir un nombre en base 10 dans la même base : vous obtiendrez ce que vous aviez au départ. Cependant, le principe est là et nous allons immédiatement l'appliquer au système hexadécimal.

Donc, afin de convertir un nombre décimal en hexadécimal, on va procéder de la même manière mais en divisant successivement par 16 (16 devient le dividende). Nous avons alors :

  2869/16 = 179,3  -->  le quotient est 179, il reste 5   (2869 - 179×16 = 5)
  179/16  = 11,2   -->  le quotient est 11,  il reste 3   (179 - 11×16 = 3)
  11/16   = 0,7    -->  le quotient est 0,   il reste 11

Ainsi, en lisant les restes de bas en haut, notre 2869 décimal s'écrira B35 en hexadécimal. Il est à noter que la dernière étape n'est jamais nécessaire dans la mesure où, si le quotient est inférieur à la base, il sera le premier chiffre du nombre écrit dans cette base.

Petite incursion du côté du système binaire

C'est bien beau tout ça : on s'est davantage familiarisé avec le système hexadécimal. Mais qu'en est-il du binaire ? C'est très simple : sous ce nom se cache la base 2 ! Donc, si vous avez tout compris pour les bases 10 et 16, vous n'aurez aucun mal à comprendre la base 2... ni n'importe quelle autre base d'ailleurs (dont le fameux système sexagésimal - la base 60 - qui est utilisé pour les mesures du temps et des angles).

Allez, reprenons un exemple, pour le sport :

  37 = 1×25 + 1×22 + 1×20
  37 = 1×25 + 0×24 + 0×23 + 1×22 + 0×21 + 1×20 (écriture complète)

Ce qui nous donne, bien sûr, 100101 en binaire.

Faites le test vous-même en divisant 37 successivement par 2 (qui devient alors le dividende et les restes ne peuvent être qu'égaux à 0 ou 1), de la même manière que précédemment avec les bases décimale et hexadécimale. Passer de l'hexadécimal au binaire, et vice-versa, est donc assez aisé étant donné que l'on a, mathématiquement, 24 = 16 : il suffit donc de regrouper les bits par 4 en commençant par la droite :

  100101 -> 10 0101

On travaille donc sur deux groupes :

  0010 en binaire donne 2 en hexadécimal
  0101 en binaire donne 5 en hexadécimal

On retrouve donc l'écriture hexadécimal du nombre binaire :

  100101 -> 25

Nous n'avons donc pas eu besoin d'utiliser de divisions successives pour retrouver notre notation hexadécimale à partir de la notation binaire

Au fait, pourquoi du binaire ? Parce qu'il s'agit du système le plus simple à mettre en oeuvre dans le domaine de l'électronique : 1 = vrai et 0 = faux. Ce sont donc des tests dits "logiques" qui envoient une des deux réponses précédentes. Rappelez-vous de votre diode : si le courant passe dans un sens, elle s'allume ("vrai" = "ouvert" = 1) ; si le courant passe dans le sens inverse, elle s'éteint ("faux" = "fermé" = 0).

Généralités complémentaires

Tableau récapitulatif

Voici un petit tableau pour que vous puissiez voir à quoi les conversions ressemblent :

  ,--------------------------------------------------------,
  | Décimal          | Hexadécimal      | Binaire          |
  |------------------|------------------|------------------|
  | 7                | 7                | 111              |
  | 13               | C                | 1101             |
  | 15               | F                | 1111             |
  | 43               | 2B               | 101011           |
  | 255              | FF               | 11111111         |
  | 437              | 1B5              | 110110101        |
  | 4095             | FFF              | 111111111111     |
  | 8058             | 1F7A             | 1111101111010    |
  | 25762            | 64A2             | 110010010100010  |
  | 65535            | FFFF             | 1111111111111111 |
  '--------------------------------------------------------'

Vous allez vite voir que pour convertir de grands nombres en binaire sans s'être créé un petit programme devient le parcours du combattant. C'est d'ailleurs pour cette raison qu'en informatique le système hexadécimal est préféré au système binaire (bien que la source absolue de tout soit le binaire).

Une histoire de notation

Il existe des notations informatiques qui permettent d'identifier un nombre décimal, un nombre hexadécimal et un nombre binaire :

  • '&x' peut précéder un nombre binaire (notamment en BASIC). De manière plus courante (C, assembleur) 'b' peut suivre un nombre de ce type ;
  • 'd' peut suivre tout nombre décimal (on peut aussi ne rien mettre puisqu'il s'agit de la notation naturelle) ;
  • '0x' ou '0h' peut précéder tout nombre hexadécimal, notamment pour la programmation en C (on retrouvera aussi 'X' et '#' de manière moins courante). Il est aussi possible de faire suivre un nombre hexadécimal par un 'h' (ce qui est en général le cas pour la programmation en assembleur).

Prenons une des lignes du tableau. Nous avons l'égalité suivante :

  25762d = 0x64A2 = 64A2h = &x110010010100010 = 110010010100010b

En mathématique, on fait suivre le nombre d'un indice, en général entre parenthèses, qui indique sa base :

  25762(10) = 64A2(16) = 110010010100010(2)

Remarque : dans le système de notation binaire, il est fréquent de regrouper les bits par 4 histoire d'aérer la notation. Dans le système hexadécimal, on regroupe par 2 ou par 4. Dans le système décimal, on regroupe les chiffres par 3 :

  25 762(10) = 64 A2(16) = 110 0100 1010 0010(2)

Bits et octets

Une petite remarque sur des termes que vous verrez très fréquemment utilisés : bits et octets.

Dans l'écriture binaire, chaque ordre (puissance de 2) est appelée "bit". Si on code un nombre sur 8 bits (c'est-à-dire que son écriture binaire va de 0 jusqu'à 11111111), on dit qu'on le code sur un octet. En effet, nous avons la conversion très simple : 8 bits = 1 octet ! Si on regarde bien notre tableau, la valeur maximale d'un octet (lorsque tous les bits sont égaux à 1 dans l'écriture binaire) est 255 en décimal soit FF en hexadécimal. Ainsi, l'information est codée la plupart du temps, soit en une suite de bits, soit en une suite d'octets (comme dans les éditeurs hexadécimaux, par exemple).

Attention à ne pas confondre "bit" (noté 'b') et le terme anglais "byte" (noté 'B') qui ne signifient ABSOLUMENT PAS la même chose : "byte" (US) = "octet" (Fr). Nous avons l'égalité suivante :

  1 kB = 1 ko = 8 kb

Donc, lorsque vous prenez une connexion internet de 2048 kb (kilobits) votre taux de téléchargement sera au maximum de 2048/8 = 256 ko (kilooctets).

Les préfixes et leur valeur

Suite à une brève discussion sur les subdivisions des octets, il nous est apparu nécessaire de mettre tout cela au point. En effet, pendant longtemps, l'utilisation des préfixes kilo, Mega, Giga, etc. étaient soumis à une règle différente que celle du système international. En effet, on avait :

  • un kilooctet (ko) = 210 octets = 1 024 octets
  • un Megaoctet (Mo) = 220 octets = 1 024 ko = 1 048 576 octets
  • un Gigaoctet (Go) = 230 octets = 1 024 Mo = 1 073 741 824 octets
  • un Teraoctet (To) = 240 octets = 1 024 Go = 1 099 511 627 776 octets

On voit qu'au lieu d'avoir des préfixes découpés en puissances 3 de 10 (10n avec n un multiple de 3), on se retrouvait avec des conversions légèrement différentes (chaque préfixe valant 1 024 fois le précédent, au lieu de 1 000 fois). Vous pouvez constater cela notamment sous Windows qui, il faut l'admettre, a du mal avec les standards.


Aujourd'hui, la norme internationale impose que les préfixes kilo, Mega, Giga, etc. soient les mêmes quelque soit l'unité utilisée. Ainsi, on devrait systématiquement trouver les égalités suivantes :

  • un kilooctet (ko) = 103 octets = 1 000 octets
  • un Megaoctet (Mo) = 106 octets = 1 000 ko = 1 000 000 octets
  • un Gigaoctet (Go) = 109 octets = 1 000 Mo = 1 000 000 000 octets
  • un Téraoctet (To) = 1012 octets = 1 000 Go = 1 000 000 000 000 octets


On peut trouver sur le net un article de la Commission International de l'Electronique qui, afin de lever toute ambiguïté, a créé de nouveaux préfixes spécialement dédiés à l'informatique. On définit ainsi le 'kilo binaire' (kibi), 'le Mega binaire' (Mebi), le 'Giga binaire' (Gibi), etc. :

  • un kibioctet (kio) = 210 octets = 1 024 octets
  • un Mebioctet (Mio) = 220 octets = 1 024 ko = 1 048 576 octets
  • un Gibioctet (Gio) = 230 octets = 1 024 Mo = 1 073 741 824 octets
  • un Tebioctet (Tio) = 240 octets = 1 024 Go = 1 099 511 627 776 octets

Les différents types de bases utilisées

Il faut savoir que plusieurs bases sont utilisées ou ont été utilisées de manière plus ou moins courante. Voici un petit récapitulatif.

  • Le système binaire - la base 2 : on vient d'en parler. Notons qu'avec nos 10 doigts, en levant le doigt pour dire '1' et en pliant le doigt pour dire '0', nous pourrions compter jusqu'à 11 1111 11112 = 1 02310 (soit 1 024 possibilités en comptant le 0) ! Ceci dit, nous serions bien en peine d'effectuer les calculs mentaux nécessaires pour réussir à communiquer !
  • Le système trinaire - la base 3 : déjà utilisé en informatique puisque cette base est également simple et dispose d'une autre réponse que "oui" ou "non", ce qui permet un troisième embranchement (par exemple un "peut-être" le signal perçu n'est pas reconnu, ce qui évite à un système d'être bloqué).
  • Le système quinaire - la base 5 : longtemps utilisé par les Mayas et par les Chinois (il suffit de regarder les bouliers). Une autre notation "logique" puisque chaque main dispose de 5 doigts : on pouvait ainsi compter jusqu'à 25 !
  • Le système octal - la base 8 : une autre écriture informatique visant à simplifier l'écriture binaire : 23 = 8 : il suffit donc de regrouper les bits par 3 en commençant par la droite.
  • Le système nonal - la base 9 : une manière de "simplifier" l'écriture trinaire en informatique.
  • Le système décimal - la base 10 : celle que nous utilisons tous les jours !
  • Le système duodécimal - la base 12 : utilisée davantage par les Anglais : un pied fait 12 pouces et un shilling fait 12 pence. On peut aussi noter qu'une année fait 12 mois et qu'une demi-journée fait 12 heures, ce qui se retrouve d'ailleurs sur les montres à aiguilles (les fameux AM et PM - matin et après-midi - utilisés par les Anglo-Saxons). Les 12 signes du zodiaque annuel ou les 12 signes du zodiaque chinois... Les 12 apôtres de Jésus mais je doute qu'on arrive à compter en "nombre de Jésus" !
  • Le système hexadécimal - la base 16 : c'est l'objet de ce document !
  • Le système vicésimal - la base 20 : utilisée il y a longtemps par les Mayas (encore eux).
  • Le système heptavicésimal - la base 27 : tout comme la base 9, elle permet de "simplifier" (en quelque sorte) l'utilisation de la base 3.
  • Le système sexagésimal - la base 60 : on l'utilise pour la mesure horaire et, d'une certaine manière, celle des angles (en physique).