Les types numériques

Les entiers

Rappel

L’entier est le type qui se rapproche le plus de la représentation machine. Nous avons vu dans la première partie que l’ordinateur sait avant tout manipuler des nombres, et cela vient de son architecture. Nous avons pris l’habitude de manipuler les nombres en base 10, alors que la machine se base sur la base 2, car elle transmet l’information au travers de câbles électriques.

Heureusement, il est facile de passer d’une base à l’autre, et cela fait l’objet du cours d’arithmétique du BTS SIO. Compter en base 10 revient à utiliser les premiers chiffres dans l’ordre : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. À ce niveau, nous avons utilisé tous les chiffres de la base 10. Il faut donc ajouter une dizaine et recommencer : 10, 11, etc. Une fois arrivés à 99, nous avons utilisé tous les chiffres disponibles au niveau des dizaines et des unités. Nous ajoutons donc une centaine : 100, 101, etc.

Compter en base 2 revient à compter en base 10, mais nous ne pouvons utiliser que les chiffres 0 et 1. Nous comptons donc 0, 1, et nous avons utilisé tous les chiffres disponibles en base 2. Il faut donc ajouter une dizaine pour passer à 10, puis à 11. À ce niveau-là, nous allons ajouter une centaine pour passer à 100. Comptez en base 2 revient à utiliser les mêmes règles qu’en base 10.

Exemple

Cette façon de compter nous permet rapidement d’avoir une correspondance entre les nombres en base 10, et les nombres en base 2. La calculatrice pour programmeur donne également la conversion des nombres décimaux en plusieurs bases (binaire, octale, hexadécimale).

En algorithmie, nous ne faisons pas la distinction entre entier signé et entier non signé. Nous considérons que les entiers peuvent avoir un signe. La déclaration des variables se fait en en-tête de l’algorithme dans une partie dédiée :

Variable :

   a, b, c : entier

 

Début

   a ← 5

   b ← 3

   c ← a + b

Fin

Ce premier algorithme est simple à comprendre. Nous déclarons 3 variables entières et nous leur donnons les noms : a, b et c. Nous signifions le début de notre algorithme avec le mot-clé « Début ». Nous affectons 5 à la variable « a ». Donc à partir de ce moment-là, à chaque fois que nous ferons appel à la variable « a », la valeur 5 sera retournée. Ensuite, nous affectons la valeur 3 à « b ». Là aussi, à partir de maintenant, à chaque fois que nous utiliserons la variable « b », la valeur 3 sera retournée. Enfin, nous affectons la variable « c » avec la somme de « a », et« b ». La somme de 3 + 5 = 8 est donc affectée à « c ».

La mémoire va stocker toutes les valeurs des variables. On peut se représenter la mémoire comme une grande étagère, dans laquelle il est possible de ranger les éléments à partir du moment où l'étagère est vide.

Voici l’état de la mémoire à la fin de l’algorithme :

Ce premier algorithme est assez simple, mais il met en place énormément de notions. Le fait de pouvoir affecter les valeurs entières 5 et 3 aux variables « a » et « b » vient du fait que les valeurs sont en adéquation avec les types de variables. L’addition entre « a » et « b » est également possible, car nous avons indiqué à la machine que les deux variables contiennent des entiers. Enfin, l’affectation de l’entier 8 à la variable « c » est également possible grâce au type entier de la variable « c ».

Conseil

Le typage des variables n’est pas seulement une contrainte, il va également permettre à la machine de comprendre ce qu’elle manipule, et potentiellement, aider le développeur en lui indiquant les opérations qui n’ont aucun sens (additionner un entier et un caractère).

Les réels

Attention

Un nombre réel permet de représenter un nombre à virgule. On pourrait se dire que finalement, le type entier est inutile, et qu’il serait beaucoup plus facile de n’utiliser que des nombres réels. Ce serait une erreur, et pour le comprendre, il faut une fois de plus, revenir à la représentation des nombres dans la mémoire de l’ordinateur.

Comme nous l’avons vu, la machine ne sait manipuler que des nombres entiers. Dans ce cas-là, comment fait-elle pour stocker un nombre réel ? L’ordinateur va procéder à une conversion, une fois de plus. Un nombre réel sur 32 bits sera représenté de la façon suivante :

1 bit de signe

8 bits d'exposant

23 bits de partie significative

Exemple

Un nombre sur 32 bits peut représenter 4 294 967 296 informations différentes. Par exemple, les nombres entiers de 0 à 4 294 967 295. Pour la représentation d’un nombre réel, il faut utiliser un bit pour le signe. Il en reste, donc 31. 8 bits sont utilisés comme exposant. Ils permettent de donner le nombre de chiffres après la virgule. Il reste donc 23 bits pour représenter la partie significative, soit 8 388 608 possibilités.

Imaginons que je veuille stocker le nombre 1.25, mais que je ne sache manipuler que les entiers. Je pourrais donc considérer que 1.25 = 125 x 10-2. Je me retrouve avec une partie significative entière (1 25) et un exposant entier (-2). C’est exactement le même principe qui est utilisé par l’ordinateur, mais il le fait en base 2. Cela serait donc une mauvaise idée d’utiliser des nombres réels là où des entiers conviendraient, car nous perdrions en précision. En effet, les bits consacrés à l’exposant réduisent d’autant les bits restant pour la partie significative.

Le fait d’utiliser des entiers ou des réels peut influencer les résultats d’opération.

Variable :

   a : entier

   b : réel

 

Début

   a ← 3 / 2

   b ← 3 / 2

Fin

« a » étant défini comme un nombre entier, lui affecter le résultat de 3/2 va tronquer le résultat. Seule la partie entière sera donc affectée à « a ». « a » vaut, à la fin de l’algorithme, la valeur entière 1. « b » ayant été défini comme réel va pouvoir contenir des chiffres après la virgule grâce à la conversion vue plus haut. « b » contiendra donc à la fin de l’algorithme la valeur réelle 1.5.

Les booléens

Les variables booléennes tirent leur nom du mathématicien et logicien George Boole (1815 - 1864). Ce dernier a mis au point une algèbre bâtie sur la logique, pour transformer en condition des phrases du quotidien. Ces conditions doivent pouvoir être interprétées sans ambiguïté par la machine, et aboutir, soit à un résultat VRAI, soit à un résultat FAUX.

Encore une fois, la machine nous dévoile son fonctionnement binaire. Il n’y a pas de demi-mesure ; soit une condition est VRAIE, soit elle est FAUSSE. Les variables booléennes sont capables de stocker les résultats des conditions, et ne peuvent donc avoir que deux valeurs : VRAI et FAUX. Le type booléen est souvent considéré dans les langages de programmation comme une extension du type entier. Bien souvent, les langages de programmation considèrent la valeur 0 comme étant FAUSSE, et la valeur 1 comme étant VRAIE. Il y a des disparités au niveau des langages à ce niveau.

La possibilité de conditionner l’exécution des programmes permet de les rendre plus flexibles. En effet, ils ne se contentent plus d’exécuter des instructions qui se suivent, mais peuvent aussi répondre à des choix. Cette partie sera plus détaillée dans la partie traitant de la structure conditionnelle (« si... », « alors... », « sinon... »), et dans la partie mathématique traitant de la logique.

Gardons pour le moment en tête qu’une variable booléenne ne peut prendre que deux valeurs (VRAI ou FAUX), et qu’elle peut stocker le résultat d’un test.

Variable :

   a : booléen

   b : booléen

 

Début

   a ← 5 < 9

   b ← 5 > 9

Fin

Dans cet algorithme, nous avons défini deux variables booléennes « a » et « b ».  Nous avons affecté à « a » le résultat du test 5 < 9. Nous savons que 5 est inférieur à 9. L’ordinateur affecte donc la valeur VRAI à « a ». Cependant, nous savons également que 5 n’est pas supérieur à 9. L’ordinateur affecte donc la valeur FAUX à « b ». Ces variables booléennes pourront être évaluées dans les structures conditionnelles et dans les boucles. Nous en reparlerons dans ces parties.

Les opérations sur les nombres

À partir du moment où nous avons donné un type à nos variables, nous savons quelles opérations nous pouvons réaliser avec elles. En effet, en tant qu’être humain, nous savons que certaines opérations n’ont pas de sens. Par exemple, multiplier un code postal et un numéro de sécurité sociale. Le type de variable va permettre de comprendre le comportement de certains opérateurs.

Si nous utilisons des variables de type numérique (entier ou réel), les opérateurs de mathématiques classiques sont disponibles.

Variable :

   a, b : entier

   som, sous, mult, div, div_ent, mod : entier

 

Début

   som ← a + b

   sous ← a - b

   mult ← a * b

   div ← a / b

   div_ent ← a // b

   mod ← a % b

Fin

Voici les opérations de base sur les variables numériques :

  • Addition : +

  • Soustraction : -

  • Multiplication : *

  • Division : /

  • Puissance : **

  • Division entière : // (quotient de la division euclidienne)

  • Modulo : % (reste de la division euclidienne)

Les opérateurs de division seront vus plus en détail dans le chapitre des mathématiques consacré à l’arithmétique.

Attention

Si vous tentez d’effectuer une opération avec des variables qui ont des types non prévus, le langage vous signalera immédiatement une erreur. Cela peut être une bonne chose pour comprendre ce qui ne va pas. Les types vont donc permettre de déterminer quelles sont les opérations possibles, et lesquelles ne le sont pas.

Enfin, si nous utilisons des variables booléennes, il est possible d’utiliser des opérateurs booléens :

Et : et logique, renvoie VRAI si la valeur à gauche de l’opérateur et la valeur à droite de l’opérateur sont toutes les deux à VRAI et renvoie FAUX sinon.

A

B

A et B

FAUX

FAUX

FAUX

FAUX

VRAI

FAUX

VRAI

FAUX

FAUX

VRAI

VRAI

VRAI

Ou : ou logique, renvoie VRAI si la valeur à gauche de l’opérateur ou la valeur à droite de l’opérateur est à VRAI et renvoie FAUX sinon.

A

B

A ou B

FAUX

FAUX

FAUX

FAUX

VRAI

VRAI

VRAI

FAUX

VRAI

VRAI

VRAI

VRAI

Non : inverse la valeur d’une variable booléenne (VRAI devient FAUX, FAUX devient VRAI).

A

non A

FAUX

VRAI

VRAI

FAUX

Remarque

Les tableaux que nous avons utilisés ici sont des tables de vérité. Ils permettent de comprendre facilement comment fonctionne un opérateur. A et B sont des variables booléennes qui ne peuvent prendre que deux valeurs qui sont : VRAI et FAUX. À partir de là, nous essayons de retrouver toutes les conditions possibles de valeur. Pour chacune des conditions, nous allons évaluer l’expression dans la colonne de droite.

Les tables de vérité permettent d’aller beaucoup plus loin, et de représenter des expressions plus complexes, composées de plusieurs opérateurs. Elles permettent également de vérifier si deux expressions sont équivalentes.