
L’objet de cet article, vous l’aurez compris, est d’expliquer une bonne fois pour toute que l’hexadécimal n’est pas une adresse !
Certains d’entre vous le savent déjà, mais il se trouve que beaucoup de personnes qui sortent d’écoles informatiques (IRIS, Info gestion, etc …) pensent à tort qu’un nombre sous sa forme hexadécimal est forcément une adresse mémoire/matérielle. La faute à leurs inattention en cours, ou a celle du prof qui ne prend pas le temps de casser cette association que font naturellement les élèves.
Toujours est-il que je vois cette confusion extrêmement souvent, alors qu’une bonne maitrise de cette partie est très simple à acquérir et c’est fort utile en programmation notamment.
Il est d’abord très important de sortir complètement du contexte informatique. En effet, bien qu’on utilises ces différentes notations en informatique, elles ne sont pas liées pour autant. Il faut donc, pour le moment, mettre totalement de coté la notion d’adresse, de pointeurs, de mémoire, …
La première chose à comprendre, c’est notre façon de compter habituelle. On compte en “décimal”, autrement dit, en base 10. Ca veut dire quoi ? Tout simplement qu’on utilise 10 sigles différents pour écrire nos nombres : 0, 1, 2, …, 9
Ca fait bien 10, quand on arrive au dernier sigle et qu’on veux ajouter une unité de plus, on remplace le dernier sigle par le premier, et on ajoute le second sigle devant.
Ainsi, notre premier sigle est le 0, notre second est le 1, notre dernier est le 9, faire 9 + 1 ca se traduit 10, on a remplacé le dernier sigle par le premier (9 par 0) et ajouté le second sigle devant (10).
Ca parait con comme ca, mais pourtant cette façon de faire est la même dans toutes les bases.
Si je prend la base 5 (je crois pas que qui que ce soit se serve de cette base), le premier sigle est donc toujours le 0, le second est toujours le 1, mais le dernier est le 4. Donc, si j’écris “10” dans cette base, cela signifie 4 + 1, et donc 5 en base 10.
Simple non ?
Le principe est le même dans toutes les bases. Cependant, notre alphabet ne comporte que 10 sigles “numériques”, ce qui nous force à utiliser d’autre sigles pour des bases >10 telles que l’hexadécimal (base 16). Les autres sigles en questions sont les premières lettres de l’alphabet, plus simple que d’inventer de nouveaux sigles, bien qu’on aurait pu.
Par conséquent, un nombre, quelle que soit sa notation, ne reste qu’un nombre, et il a la même valeur.
D’où vient la confusion entre adresse et hexadécimal ? Tout simplement de l’utilisation quotidienne de l’informatique par un informaticien (ou apprenti informaticien).
En effet, on utilise très souvent soit des adresses, soit des offset (qui sont en réalité semblables en tout point à des adresses), or, celles-ci sont toujours affichées sous leurs notations hexadécimales. Ce qui fait qu’on associe naturellement hexadécimal et adresse.
D’abord, qu’est-ce qu’une adresse ? L’adresse est juste le numéro d’indexe d’un octet ou un périphérique. On colle tout a la suite les un des autres (matériel, mémoire, …), on commence a compter à 0, et le tour est joué.
Alors pourquoi on affiche ces adresses sous forme hexadécimal. Hé bien tout simplement pour une question esthétique et pratique. Ca vous semble peut être étrange parce que l’hexadécimal n’est pas lisible naturellement par des humains, vu qu’on compte en base 10 depuis notre plus jeune âge. Sachez cependant que ce n’est qu’une question d’éducation, après tous, les Mayas comptaient non pas en base 10 mas en base 20, alors pourquoi pas nous ?
Prenez un ordinateur banal d’aujourd’hui. Tout le matériel qui le compose est adressable, et par matériel j’entend bien matériel, pas seulement la mémoire vive. C’est à dire, la carte son, la carte réseau, la carte graphique et ses 512Mo (ou plus) de mémoire, les contrôleurs IDE/SATA/USB/FireWire/… et les 4Go de mémoire vive. Même si on ne considère que la mémoire vive, 4Go octets ca donne 4 294 967 296 octets adressables, et donc autant d’adresses différentes. Le chiffre commence à être long non ?
Maintenant, parlons d’offset, en réalité l’offset c’est exactement pareil qu’une adresse, mais à partir d’une autre adresse. C’est un écart entre une adresse et une autre. A quoi ca sert ? Ca sert par exemple à se déplacer dans un fichier. L’adresse qu’on utilise est celle du fichier, l’offset donne une adresse a l’intérieur du fichier.
Comme on vient de le voir, 4Go de mémoire ca donne de grandes adresses, et vous pensez que ca donne quoi sur un fichier d’image blue-ray ? Et encore, aujourd’hui rare sont les fichiers de plus de 20Go, mais il y a 10 ans, rares étaient les fichiers de plus de 1Go, alors imaginez demain…
On va se retrouver avec des nombres gigantesque en guise d’adresse. Ce qui fait que la colonne de gauche de votre éditeur hexa décimal, de votre visualisera de mémoire, …, prendra la moitié de l’écran, juste pour vous indiquer l’adresse.
Le coté pratique se trouve de part la relation entre l’hexa et les octets. En effet, un octet est un groupement de 8 bits, ce qui fait qu’un octet peu prendre 256 valeurs différentes (0->255). Or, 255 en hexa, ca donne FF. Si on reprend notre histoire de sigle plus haut, on voit immédiatement que FF est la valeur maximal que l’on peut écrire avec seulement 2 sigles en hexadécimal. Si on veut faire plus, il faut ajouter un sigle devant. Ca veut dire quoi ? Ca veut tout simplement dire que chaque paquet de 2 sigle tient exactement sur 1 octet.
Mais a quoi ca peut bien servir ?
D’abord il faut se rappeler qu’un ordinateur c’est avant tout des composants électroniques et qu’en électronique numérique on travail en binaire. Donc, quand on fait une puce mémoire, celle-ci fait généralement 2^n bits, et par conséquent, possède une plage d’adressage de 2^n adresses.
Admettons deux puces électronique de 64Ko (taille extrêmement fréquente). Ca fait 65 536 adresses par puce.
La première puce est à l’adresse 0 et continue jusqu’a l’adresse 65 535. La seconde puce est à l’adresse 65 536 et continue jusqu’a l’adresse 131 071.
Comme on peut le voir, c'e n’est pas pratique d’utiliser la notation décimale. Dans l’exemple, c’est pas bien dur puisqu’il n’y a que deux puces, mais si vous en avez 10, vous aller être obligé de calculer l’adresse de début et de fin de chaque puce afin de savoir, pour une adresse donnée, dans quelle puce vous êtes.
Si on regarde du coté de l’hexa, 65 535 ca donne FFFF (utilisez la calculette pour vous en convaincre).
Conséquence directe, la première puce est adressée sur 0XXXX, la seconde puce sur 1XXXX, et voila, via une notation hexadécimale, on voit immédiatement et sans se prendre la tête, si on est dans la première ou la seconde puce.
C’est très visuel et c’est pour ca qu’on utilise la notation hexadécimale pour les adresses et offset, parce que ca nous permet de nous y retrouver plus facilement.
Comme on viens de le voir, on utilise la notation hexadécimale pour les adresses parce que c’est plus pratique pour nous. Mais ca ne veux pas dire qu’un nombre sous sa forme hexadécimale est une adresse. En effet, on retrouve le coté pratique de l’hexadécimal dans d’autres applications très fréquentes. On utilise l’hexadécimal pour son coté visuel.
Par exemple, en optique, on sait qu’en mélangeant une lumière rouge, une verte et une bleue, en faisant varier leurs intensité à chacune, on peut obtenir toutes les couleurs. Et si on regarde nos écrans, comment ils fonctionnent ? Ils projettent tout simplement ces 3 couleurs, en faisant varier leur intensité, pour reproduire la couleur souhaité.
Puisque c’est ainsi, on peut réduire la notion de couleur à une notion d’intensité de rouge, de vert et de bleu. Pour se simplifier la vie, puisqu’un ordinateur travaille avec des octets, on va prendre un octet pour le rouge, un autre pour le vert et un dernier pour le bleu. Chaque octet peut varié de 0 à 255, donc par une simple règle de 3 on obtient un pourcentage d’intensité (0->0%, 255->100%).
En conséquence, on peut utiliser une notation hexadécimale pour visualiser une couleur : FF0000. Cette couleur donne du rouge car on à mis 100% d’intensité de rouge, 0% pour le vert et le bleu.
Cette notation est tout de même bien plus visuelle que le nombre décimal équivalent : 16 711 680.
La notation hexadécimale n’est absolument pas liée à une adresse. On utilise l’hexadécimal uniquement parce que c’est plus visuel et/ou pratique à l’utilisation.
Donc, arrêtez de sortir un pointeur dès que vous voyez un nombre en hexa et pas de panique, c’est surement noté ainsi pour vous faciliter la tâche, pas pour vous faire mal à la tête.
Commentaires
il se trouve que beaucoup
Je connais bien ce Cyril,
Je connais bien ce Cyril, mais non, ce n'est pas le seul, j'en connais beaucoup beaucoup qui font cette erreur. J'en connais d'autant plus que j'y étais en IRIS et que j'avais parallèlement contacte avec plusieurs autres promos notamment dans d'autres écoles que la mienne.
Le problème va même beaucoup plus loin en partie à cause des langages sans pointeurs (du moins immédiatement) comme par exemple le Java ou encore le C#. La raison est que dans ces langages on n'utilise pratiquement jamais l'hexadécimal, parce que la syntaxe simplifie certaines choses. Par exemple, en C on prend l'habitude de faire des #define pour faire les énumération de valeur. Ce qu'on appelle communément des "flags". A coup de "ou" binaire on additionne les flags, ca forme un entier, et hop, ni vu ni connu, mais pour ca on utilise l'hexa pour déterminer plus simplement les différentes valeurs.
Alors qu'en C#, on utilise le mot clef enum associé à l'attribut Flag, et voila, tout le travail est déjà fait, ou presque.
De ce fait, l'utilisation de l'hexa est quasi inexistante, et comme ce sont des langages où on utilise pas les pointeurs/adresses, ca renforce l'impression que l'hexa est directement associé à l'adressage.
"Le travail c'est la santé. Rien faire c'est la conserver" [© Henri Salvadore]
Poster un nouveau commentaire