Cours issu de http://thierry.col2.free.fr/restreint/exovideo_lycee/TS_ISN.htm
Codage binaire des nombres et des textes
Un convertisseur en ligne: http://wims.unice.fr/wims/wims.cgi?module=tool/number/baseconv.fr
I) Codage des nombres
1) Codage des nombres entiers positifs
Les nombres entiers positifs sont codés avec leur valeur en base 2. Un entier est codé sur un
Mot. On peut donc représenter les entiers sur des intervalles qui dépendent du type de microprocesseur.
mot de 16 bits : [ 0 , 216 − 1 ]
mot de 32 bits : [ 0 , 232 − 1 ]
mot de 64 bits : [ 0 , 264 − 1 ]
On ne peut donc représenter qu’un petit sous-ensemble de N avec ce système.
Par exemple pour un microprocesseur 16 bits (mot de 16 bits) le chiffre binaire correspondant à (277)10 sera : (0000 0001 0001 0101)2
Ex 1 : quel est, pour un microprocesseur de 64 bits, le nombre entier positif maximal que l’on peut coder ?
Réponse : environ 1,8x1020.
2) Addition de 2 nombres positifs
Comme en base 10, l’addition de deux nombres binaires s’effectue avec retenue : 1 + 1 = 0 et on retient 1. Le calcul s’effectue du bit de poids le plus faible vers le bit de poids le plus fort.
Exemple : soit un ordinateur manipulant des mots de 8 bits. Quand on effectue la somme de 12 + 5 = 17
l’ordinateur effectue la somme suivante :
0000 1100
+
0000 0101
= 0001 0001
Ex 2 : multiplication par deux de 2 nombres entiers positifs
Comment effectuer la multiplication par deux ?
Exemple : nombre sur 4 bits.
en décimal 2x4 = 8
(2)10 = (0010)2
(4)10 = (0100)2
(8)10 = (1000)2
Pour multiplier par 2 un nombre binaire il suffit de rajouter un zéro à droite du nombre !
3) Codage des entiers négatifs
La solution choisit pour coder les nombres entiers négatifs est appelé le complément à 2.
on fixe le nombre n de bits
on sépare le premier bit à gauche noté s et les n-1 bits à droite. Les n-1 bits représentent, en binaire, une valeur positive noté v. Si s =0, la valeur du nombre est alors v.
si s = 1, la valeur du nombre vaut -2n-1 + v.
Ex 3 : compléter le tableau suivant pour n = 4
Ex 4 : effectuer l’opération (3) + (-4) en binaire et vérifier qu’on trouve le nombre -1
0011
+
1101
=
(1111)2 = -2n-1+v = -23 +7 = ( -1)10
Autre manière de voir le complément à 2
(0111)2 = (7)10
On prend la négation de chaque bit ( non 1 = 0, opération réalisée avec des portes logiques) et on ajoute 1 à cette valeur
La négation de 0111 est 1000
on ajoute 1: 1000 + 1 = (1001)2 = (-7)10
4) Les nombres réels
Un ordinateur à une mémoire restreinte, il ne peut, par exemple, stocker tous les chiffres du résultat de 21/2. Il a une représentation interne des réels en notation scientifique. On appelle ce nombre un nombre à virgule flottante. Ces nombres et les calculs sont régit par un standard, l’IEEE-754. (voir wikipédia pour la définition précise du standard)
Le codage d'un nombre en virgule flottante se fait sous la forme d'un triplet :
- signe s (si s = 0 le nombre entier est positif, si s = 1 le nombre entier est négatif)
- une mantisse M
- un exposant E sous la forme 2E
Un nombre flottant normalisé a une valeur v donnée par la formule suivante :
v = s × 2E × m.
s = ±1 représente le signe (selon le bit de signe) ;
E est l'exposant avant son décalage de 127 ;
m = 1+mantisse M . m représente la partie significative (en binaire), d'où 1 ≤ m < 2 (la mantisse M étant la partie décimale de la partie significative, comprise entre 0 et 1)
Exemple : pour le nombre réel 1,25x223
le signe est positif (s = 0)
la mantisse M = 0,25
l’exposant E = 23
m = 1,M = 1,25
Suivant la puissance du calculateur on code le nombre réel sur :
- 32 bits : (-1)s x 1,M x 2E+-127 . Ce type de codage est appelé codage simple précision.
- 64 bits : (-1)s x 1,M x 2E+-1023 . Ce type de codage est appelé codage double précision.
Le nombre de bits pour le signe, la mantisse et l’exposant sont :
- Simple précision : 23 bits de mantisse, 8 bits d'exposant, 1 bit de signe
- Double précision : 52 bits de mantisse, 11 bits d'exposant, 1 bit de signe
Exemple du codage d’un nombre réel avec la norme IEEE 754
On veut coder le nombre réel (-51,375) sur 32 bits (simple précision)
1) le signe négatif est mis dans le bit s = 1
2) on sépare le nombre en deux: la partie entière (51) et la partie fractionnaire ou décimale (0,375)
3) on convertit la partie entière en nombre binaire : 5110 = 1100112
4) on convertit la partie décimale (ou fractionnaire) en nombre binaire de la façon suivante : on multiplie la partie décimale par 2 jusqu’à obtenir 0
0,375x2 = 0,75
0,75x2 = 1,5
0,5x2 = 1,0
0,0x2 = 0,0
En effet 0,375 = 0x2-1 + 1x2-2 + 1x2-3 + 0x2-4
Le nombre réel en base 10 s’écrit en base 2 :
(51,375)10 = (110011,0110)2
5) On décale la virgule à gauche de 5 rangs pour l’écrire sous la forme 1,M.
L’exposant de la puissance de 2 vaut 5: E =5
l’écriture du nombre binaire est 1, 10011011000..
la mantisse est M = (100110110000. . .)2
par conséquent le nombre
(51,375)10 = (1, 10011011000)2x25
Retrouvons ce résultat :
(1x20 + 1x2-1+1x2-4 + 1x2-5 + 1x2-7+1x2-8)x25 = 32 + 16 + 2 + 1 + 0,25 + 0,125 = 51,375
Pour respecter la norme IEEE 754 on ajoute 127 à l’exposant avant de le coder :
E = 5 + 127 = (132)10 = (10000100)2
On complète la mantisse à 23 bits (en simple précision, le nombre réel étant codé en tout avec 32 bits)
M = (10011011000000000000000)2
Le nombre (-51,375)10 s’écrit avec la norme IEEE 754 en simple précision :
1 10000100 10011011000000000000000
signe exposant mantisse
Ex 5 : coder le nombre 6,875 avec la norme IEEE 754 en simple précision.
Étape 1 : le signe s = 0 car le nombre est positif
Étape 2 : codage en binaire de la partie entière
(6)10 = (110)2
Étape 3 : codage de la partie fractionnaire (après la virgule)
0,875x2 =1,75
0,75x2= 1,5
0,5x2 =1,0
0x2= 0,0
0x2=0,0
etc..
Étape 4 : décalage de la virgule pour obtenir l’exposant E et la mantisse:
(6,875)10 = (110,1110…)2 , il faut décaler de 2 rangs vers la gauche la virgule pour obtenir un nombre de la forme 1,M
l’exposant E = 2. pour répondre à la norme IEEE 754 il faut ajouter 127 à l’exposant :
E = 2+127 = (129)10 = (10000001)2
La mantisse M vaut :
M = (10111000000000000000000)2 (on rappelle que la mantisse est codée sur 23 bits)
Le nombre 6,875 vaut en codage IEEE 754 :
0 10000001 10111000000000000000000
signe exposant mantisse
II) Codage du texte
1) Les différents type de code
Le texte est constitué de caractères (lettre, chiffre signe de ponctuation ). Chaque caractère est représenté par un entier. Il existe de nombreux codages des caractères ; les principaux codages pour les occidentaux sont :
1) Le code ASCII (ISO 646)
2) Les codes ISO 8859-1 / ISO 8859-15 (symbole e)
3) Le code Unicode
4) Les codes UTF-8 / UTF-16 / UTF-32
2) Le code ASCII
L’ASCII (American standard code for information interchange) a été créé au début des années 60. Son principe consiste à associer à chaque lettre, chiffre ou caractère d’un clavier d’ordinateur un entier compris entre 0 et 127, donc représentable sur 7 bits. Avec ce code on peut représenter les chiffres, les lettres latines, et les principaux symboles de ponctuation. Exemple : lorsqu’on tape dans un texte sur la barre d’espace (space) , l’ordinateur enregistre dans sa mémoire vive (RAM) le code hexadécimal (20)hex . Le codage binaire sur 7 bits correspondant est : (010 0000)2 = (32)10
Remarque: comment insérer un caractère ASCII dans un document Excel?
Outre la saisie d'un caractère au clavier, vous pouvez également utiliser la code de caractère du symbole comme raccourci clavier ou lorsqu'un symbole n'est pas disponible sur le clavier que vous utilisez.
Pour insérer un caractère ASCII des tables ci-dessous, appuyez sur la touche Alt et maintenez-la enfoncée tout en tapant l'équivalent numérique décimal.
Par exemple, pour insérer le symbole du point d'exclamation ! , appuyez sur la touche Alt et maintenez-la enfoncée tout en tapant 33 sur le pavé numérique.
Ex 6: retrouver à l’aide du tableau ci-dessus le codage hexadécimal, décimal et en déduire le nombre binaire correspondant à la lettre L.
Réponse : (4C)hex = (100 1100)2 = (76)10
3) Le codage ISO 8859-1
Le codage ASCII suffit pour coder un texte anglais mais ne suffit pas pour les autres langues. Par exemple, les lettres accentuées ne figurent pas dans le code ASCII. Le code ISO 8859-1 a été créé dans les années 80, il est appelé également ‘latin-1’ . Il permet de représenter les caractères accentués. A chaque caractère alphanumérique (lettre, chiffre, ponctuation etc..) est associé un nombre compris entre 0 et 255. On a donc besoin de 8 bits pour représenter l’ensemble des caractères.
Exemple : le codage du point d’interrogation est (3F)hex = (0011 1111)2
Ex 7: retrouve à l’aide du tableau ci-dessous le code hexadécimal, décimal et binaire de la lettre à.
Réponse : le code de la lettre à est : (E0)hex = (1110 0000)2 = (224)10
4) L'Unicode
D’autres codages ont été définis pour les autres langues : le chinois, l’arabe etc.. Ces codes sont compatibles avec l’ASCII mais ne le sont pas entre eux. Comment écrire un texte multilingue ? On a créé un unique codage universel l’Unicode. Les valeurs entières associées étaient initialement comprises entre 0 et 65235 donc codées sur 16 bits. Cependant ce codage soufre de nombreux défauts (car mis en place par l’homme). Maintenant il est codé sur 32 bits. Toutes les langues connues (sur Terre) sont représentées dans Unicode.
Problème! le é peut se représenter soit par le caractère ‘é’ du latin-1, soit par la suite de caractère « ‘e »
Exemple : de table de caractères UNICODE (Plan multilingue de base (PMB, 0000 à FFFF))
Pour pallier les problèmes de l’ UNICODE on a construit des codages tels que l’UTF-8 qui est le codage standard le plus couramment utilisé.