[AUDIO_VIDE] Bonjour. Dans ce cours, nous allons nous intéresser aux symboles et numérations binaires, à l'arithmétique modulaire et aux nombres signés. Ensuite nous verrons les types du langage C, l'hexadécimal et le codage des caractères. Lorsque nous regardons une LED dans une enseigne ou afficheur à LED, nous remarquons que la LED est soit allumée, soit éteinte. Les deux états binaires peuvent être mémorisés dans un dispositif appelé bascule. Le champ de bits que voici peut à la fois représenter l'état de huit lettres, le code d'un caractère ou un nombre écrit en base 2. Nous savons que l'ordinateur travaille en base 2. La correspondance entre la base 10 et la base 2. Comme nous le voyons selon ce tableau, le nombre 10 en base 10 s'écrira en base 2, 1010. Cela signifie que chaque position possède un point. Ici nous avons les rangs ou les positions. La position 3 a pour poids 8 en base 2 et 1000 en base 10. Le nombre 1234 s'écrira en base 2, 10011010010. Ici nous voyons que le rang 1 qui a pour poids 2 est représenté. Le rang 4 qui a pour poids 16 est ici représenté. Les rangs 6 et 7 qui ont pour poids 64 et 128 sont ici représentés, et le rang 10 qui a pour poids 1024. La somme des différents poids donne bien le nombre 1234. Nous savons que les mathématiciens utilisent les nombres. Dans les formules mathétiques, nous pouvons utiliser des nombres aussi grands que nous le voulons. Malheureusement, lorsque ces nombres doivent être représentés à l'intérieur de l'ordinateur, il doit être limité en taille. Conséquences liées à cette limitation de la taille des nombres? Cela nous introduit à l'arithmétique modulaire. Pour le montrer, voyons les lois de l'arithmétique modulaire sur trois bits. Avec trois bits, nous pouvons représenter les nombres de 0 à 7, ce qui nous donne huit états. Amusons-nous à faire cette addition que voici sur trois bits. Le nombre 3 représenté par 011 plus le nombre 2, 010. Nous le voyons bien sur le tableau ici. Les lois de l'addition sont données dans la table que voici. 1 plus 0 nous donne 1, retenue 0. 1 plus 1 nous donne 0, retenue 1. Forts de cette loi, faisons notre addition. 1 plus 0 nous donne 1. 1 plus 1 nous donne 0, retenue 1. 1 de retenue plus 0 plus 0 nous donne 1. Nous voyons bien que 101 selon le tableau correspond bien à 5. Le résultat est juste. Effectuons une deuxième addition. Additionnons 6 et 3. Nous obtenons 0 plus 1 nous donne 1. 1 plus 1 nous donne 0, retenue 1. 1 de retenue plus 1 plus 0 nous donne 0. Et nous avons 1 de retenue. Le résultat trouvé sur trois bits est 001, ce qui nous donne 1. Nous voyons que le résultat n'est pas juste parce qu'il y a dépassement de capacité. Effectivement, 3 plus 6 nous donne 9. Or comme nous l'avons dit au départ, sur trois bits nous ne pouvons représenter que les nombres compris entre 0 et 7 inclus. Il y a dépassement de capacité, ce qui nous donne un résultat erroné. Représentons les nombres sur cette roue que voici. 0, 1, 2, 3, 4, 5, 6, 7, puis nous revenons à 0. Mais remarquons qu'ici nous avons une zone qui provoque le dépassement de capacité. Ainsi, d'après notre première opération, nous avons 3 plus 2. Pour faire une addition, nous allons nous déplacer dans le sens horaire, et pour faire une soustraction, nous allons nous déplacer dans le sens contraire. Ainsi, 3 plus 1 plus 2 nous donnent bien 5. Le résultat est correct. Par contre 6 plus 3, donc nous allons faire 6 plus 1 plus 2 plus 3 nous donne bien le résultat 1 que nous avons trouvé précédemment, mais comme nous avons franchi la zone de dépassement de capacité, le résultat est donc faux. Ceci peut être encore expliqué avec cette représentation en escalier. Nous avons 0, 1, 2, 3, 4, 5, 6, 7. Ensuite nous retombons à 0 pour le 8. Le 9 est bien 1, 10, 11, 12, 13, 14, 15 et nous revenons ici à 0. Effectuons à présent une soustraction. Nous avons 6 moins 3. 6 moins 1 moins 2 moins 3. On a bien le résultat 3, ce qui est juste. La deuxième soustraction est 3 moins 5. Nous avons 3 moins 1 moins 2 moins 3 moins 4 moins 5. Nous avons comme résultat 6, mais nous savons que nous avons franchi la ligne du dépassement de capacité, donc le résultat est faux évidemment. Les nombres négatifs et les nombres positifs sont appelés dans le langage informatique les nombres signés. Ainsi, nous avons sur trois bits les nombres signés 0, 1, 2, 3 et les nombres négatifs -4, -3, -2, -1. Nous pouvons, sur cette fonction en escalier, montrer ici les nombres positifs et ici les nombres négatifs en rouge. Nous remarquons ici la zone de dépassement de capacité. Elle se situe entre -4 et 3. Effectuons quelques opérations avec les nombres signés. Nous avons -1 plus 3. Le résultat est bien 2, ce qui est correct. -1 plus 1 plus 2 plus 3, nous avons bien 2. Nous n'avons pas franchi la zone de dépassement de capacité, donc le résultat est correct. Par contre, l'addition 2 plus 3 nous donne -3. 2 plus 1 plus 2 plus 3, nous avons bien le résultat -3, qui est le même que celui obtenu là, mais comme il y a eu franchissement de la zone de dépassement de capacité, le résultat est faux. Tout comme l'addition, nous avons des résultats corrects tels que dans ce cas, et des résultats faux comme le montre cette opération. Dans nos programmes, nous manipulons des nombres ayant différentes tailles. Pour que le compilateur puisse de façon optimale leur allouer un espace mémoire, il faut leur attribuer des types. Le langage C prévoit les types désignés ici. Nous voyons des types de 8 bits, signés ou non signés, des types de 16 bits, signés ou non également. Mais nous remarquons que par exemple le type caractère peut à la fois désigner un nombre de 8 bits signé ou non et ceci selon les réglages du compilateur. Pour rendre ces types cohérents, tout le long du cours, nous allons utiliser les types en C version C99. Les différents types sont ici représentés. Ils sont tout terminés par souligné t qui indique bien que c'est un type. Ensuite, le nombre de bits utilisés pour le coder est clairement défini. Ici nous avons les 8 bits, les 16 bits et les 32. Nous avons int qui signifie qu'il s'agit d'entiers et une précision, le u dans certains endroits pour dire que ce sont des nombres non signés. uint16_t indique clairement qu'il s'agit de nombres de 16 bits positifs, compris entre 0 et 2 puissance 16 moins 1. Le binaire est commode pour la machine mais mal commode pour l'être humain. Pour écrire les nombres, nous allons utiliser très souvent l'hexadécimal. Voyons sur cet exemple comment passe-t-on de la base 2, du binaire à l'hexadécimal. Nous avons le champ de bits que voici. Nous le découpons en tranches de quatre de la droite vers la gauche. Chaque tranche de quatre ou quarté est codée ensuite en hexadécimal à l'aide de ce tableau que voici. Ainsi, la première tranche 0000 qui correspond à cette ligne est codée 0 en hexadécimal. Ensuite la deuxième tranche représentée par ces bits 1010 qui correspond à cette ligne est codée A et ainsi de suite. La notation en langage C de ce champ de bits en hexadécimal sera donc 0x5BA0, le x représentant l'hexadécimal. Nos programmes n'utilisent pas que des nombres. Ils utilisent également des caractères. Pour coder les caractères, on utilise plusieurs tables. La plus connue est la table ASCII représentée ici. Nous remarquons que dans cette table, nous avons les lettres de l'alphabet en majuscule, les voici, et les minuscules représentées là. Ici nous avons les chiffres. Là nous avons quelques symboles de la ponctuation, et dans cette zone-là, nous retrouvons des caractères spéciaux. Par exemple l'indicateur de fin de ligne, le bip là et DEL qui vous permet d'effacer un caractère. Ainsi, la lettre A majuscule que voici aura pour code 64 + 1, ce qui donne le code 65. Nous remarquons que cette table ne contient pas les lettres accentuées. Il y a des compléments et il y a également d'autres tables de codage telles que la table de codage UTF-8. Résumons rapidement ce que nous avons vu dans ce cours. Nous avons vu les symboles et la numération binaire, l'arithmétique modulaire et les nombres signés, ce qui nous a permis de comprendre les dépassements de capacité. Ensuite, nous nous sommes intéressés aux types en C, du langage C, puis nous avons vu l'hexadécimal et nous avons terminé par le codage des caractères.