Systèmes de numération

. Par : Christian. URL : https://www.locoduino.org/spip.php?article99

Il n’est pas nécessaire de maîtriser ces notions pour commencer à programmer Arduino ; ceci dit, ce n’est pas si compliqué que cela puisque ma sœur, qui a été institutrice, l’a enseigné à des gamins de primaire. Ces notions vous seront utiles pour comprendre des programmes trouvés sur le net ou dans des livres.

Dans l’article Types, constantes et variables, on a vu que les octets sont constitués de 8 bits et peuvent constituer des nombres. Dans les programmes, on peut représenter ces nombres soit en décimal, soit en binaire, soit en hexadécimal, trois systèmes de numération possibles. Voici comment passer de l’un à l’autre, l’exemple étant limité (pour l’instant) à des octets non signés (allant de 0 à 255).

Système décimal

On compte tous en décimal, ce qui signifie qu’il y a dix chiffres (0 à 9) pour constituer un nombre. Prenons le nombre 137 par exemple. Si on le décompose, on a 1 centaine (102), 3 dizaines (101) plus 7 unités (100). On rappelle ici que 101 = 10 et 100 = 1.
Donc, quand on regarde les chiffres qui composent un nombre décimal, de la droite vers la gauche, on a :

  • le nombre d’unités (nombre de fois 10 puissance 0)
  • le nombre de dizaines (nombre de fois 10 puissance 1)
  • le nombre de centaines (nombre de fois 10 puissance 2)
    etc.
    Jusque là, vous le saviez déjà ...

Système binaire

Là, il n’y a que deux chiffres possibles, 0 et 1
Un octet est une combinaison des différentes possibilités avec 8 cases comprenant chacune 0 ou 1.
Par exemple l’octet 11100101 ; c’est un nombre (binaire) composé de chiffres égaux à 0 ou 1.
Si on le regarde de la droite vers la gauche, le nombre se décompose en :

  • 1 fois 2 puissance 0 (tout nombre à la puissance 0 vaut 1)
  • 0 fois 2 puissance 1 (soit 0 X 2 = 0)
  • 1 fois 2 puissance 2 (soit 1 X 4 = 4)
  • 0 fois 2 puissance 3 (soit 0 X 8 = 0)
  • 0 fois 2 puissance 4 (soit 0 X 16 = 0)
  • 1 fois 2 puissance 5 (soit 1 X 32 = 32)
  • 1 fois 2 puissance 6 (soit 1 X 64 = 64)
  • 1 fois 2 puissance 7 (soit 1 X 128 = 128)
    En faisant la somme, notre octet vaut :
    1 + 0 + 4 + 0 + 0 + 32 + 64 + 128 = 229 (en décimal)
    11100101 en binaire vaut 229 en décimal. Retenez le bien ...

Système hexadécimal

Ce système compte avec 16 chiffres, de 0 à 9, puis A, B, C, D, E et F, ce qui fait bien 16 symboles.
Par exemple A en hexadécimal vaut 10 en décimal, B vaut 11, etc.
Prenons le nombre 3FF en hexadécimal. Si on le décompose, on a 3 fois 16², F (c’est-à-dire 15) fois 16 et F (c’est-à-dire 15) unités, soit une somme de 1023.

Le passage du binaire en décimal est très simple. Reprenons notre octet 11100101 et décomposons le en deux fois quatre bits ; nous obtenons 1110 et 0101.
1110 vaut 14 soit E en hexadécimal (on l’a fait plus haut)
0101 vaut 5
En hexadécimal, cet octet vaut E5
Ou encore (E étant égal à 14) : 14 X 16 + 5 = 224 + 5 = 229 (en décimal). Tiens, on retrouve la même chose !

En langage Arduino, cela donne :

a = 229;
b = 0b11100101;
c = 0xE5;

Comme vous l’avez compris, a = b = c.

Pour un humain, avec un peu d’habitude, on passe très vite de quatre bits au chiffre hexadécimal de 0 à F, et E5 est plus digeste que 11100101 !!!

Beaucoup de calculatrices font la transformation hexadécimal en décimal ou binaire et réciproquement (notamment la calculatrice de Windows (ou Mac ou Linux) en affichage programmeur !). Vous pouvez essayer par vous même et vous verrez notre nombre (229) affiché en binaire et en hexadécimal.