• Aucun résultat trouvé

Codage des nombres et du texte

N/A
N/A
Protected

Academic year: 2022

Partager "Codage des nombres et du texte"

Copied!
6
0
0

Texte intégral

(1)

Codage des nombres et du texte

Dans ce cours nous allons voir comment utiliser le binaire pour représenter des nombres ou un texte.

1 Coder des nombres négatifs

On sait représenter des nombres entiers positifs en binaire, mais comment coder les entiers négatifs ? La mauvaise idée

On xe le nombre de bits alloués pour coder le nombre (par exemple 4) et le premier bit est un bit de signe. S'il vaut 1, le nombre est négatif, s'il vaut 0 le nombre est positif. Le reste des bits représente le nombre.

Par exemple, 1011 est en réalité "moins 011", c'est à dire -3 et 0011 est le nombre 3.

EXERCICE 1

• Coder sur 6 bits les nombres 17 et -10 selon cette méthode.

• Eectuer en binaire l'opération 17+(-10). Quel résultat obtient-on ?

La bonne idée : le complément à 2 Dénition 1

Pour coder les nombres relatifs de −2n à2n−1, on utilisen+ 1bits (un de plus) et :

• Si l'entier relatif xest positif ou nul, on le représente comme l'entier naturel x (avec un bit à 0 en plus devant).

• S'il est strictement négatif, on le représente comme l'entier naturel 2n+1− |x|. Exemple : On code le nombres de -4 à 3 sur 3 bits de la façon suivante :

3 0 1 1 2 0 1 0 1 0 0 1 0 0 0 0

-1 1 1 1 8−1 = 7 -2 1 1 0 8−2 = 6 -3 1 0 1 8−3 = 5 -4 1 0 0 8−4 = 4

Il existe une astuce pour trouver la représentation d'un nombre négatif sans refaire le calcul : il faut inverser tous les 0 et 1 du nombre positif puis faire l'opération +1 au résultat... ça ne va pas forcément plus vite ! :)

(2)

EXERCICE 2

• Coder sur 6 bits les nombres 17 et -10 selon cette méthode.

• Eectuer en binaire l'opération 17+(-10). Quel résultat obtient-on ?

Cette fois-ci les additions et soustractions marchent ! Il sut d'ignorer le bit de poids fort en cas de dépassement.

2 Coder des nombres à virgules

L'idée pas top

On pourrait coder un nombre à virgule en xant le nombre de bits avant et après la virgule (les bits après la virgule correspondent à des puissances de 2 négatives : 2−1 = 0.5,2−2 = 0.25, 2−3 = 0.125, 2−4 = 0.0625,2−5 = 0.03125...).

EXERCICE 3 Écrire le nombre 2,625en binaire avec 3 bits avant et après la virgule.

Ce n'est pas très précis et ça ne permet pas de représenter des nombres très grands ou très petits... ou alors il faudrait plusieurs dixaines d'octets par nombre... c'est beaucoup !

En pratique, les nombre décimaux sont stockés en mémoire à l'aide du codage "à virgule ottante".

La bonne idée : nombres à virgules ottantes

(3)

Dénition 2

On utilise classiquement 32 bits pour coder un nombre à virgule ottante. On utilise 1 bit pour le signe, 8 bits pour l'exposant et 23 bits pour la mantisse.

Par GMjeanmatt, CC BY-SA 3.0, Wikimedia

• Le signe+ est représenté par 0 et le signe−par 1.

• L'exposantnest un entier relatif compris entre -126 et 127 (les exposants -127 et +128 sont réservés aux exceptions : nombres innis, nombres mal codés...).

Attention ! Pour faciliter la comparaison de deux exposants, ils ne sont pas codés selon la méthode du complément à 2 mais sont simplement "décalés" : on code en ajoutant 127 au nombre que l'on voulait. L'exposant est donc codé par un nombre entre 1 et 254 (0 et 255 réservés aux exceptions). Par exemple, l'exposant -30 est ainsi codé par le nombre 127-30 = 97.

• La mantissemest un nombre binaire à virgule compris entre 1 inclus et 2 exclu, comprenant 23 chires après la virgule. Comme cette mantisse est comprise entre 1 et 2, elle a toujours un seul chire avant la virgule et ce chire est toujours un 1 ; il est donc inutile de le représenter et on utilise les 23 bits pour représenter les 23 chires après la virgule.

Par exemple pour0 01111100 010000000000000000000002: le signe est +, l'exposant est124−127 =−3, et la mantisse est1,012 soit1012÷22 (on a décalé la virgule pour avoir un nombre sans virgule), c'est- à-dire5÷4 = 1,25 en décimal. Le nombre représenté est donc+1,25×2−3 soit +0,15625...

Remarque 1 : Le nombre non nul le plus proche de zéro est ±2−126 ≈ ±1,175494351×10−38. Le nombre dont la valeur absolue est la plus grande est donc ±(2−2−23)×2127≈ ±3,4028235×1038. En réalité, on peut coder des nombres encore plus proche de 0 en mettant tous les bits de l'exposant à 0.

On parle de nombre "dénormalisés". L'ordinateur considère le nombre±2−126×0, ... où...représente les chires de la mantisse. On peut ainsi coder les nombres aussi petits que 1,4×10−45environ.

Remarque 2 : En codant un nombre à virgule sur 32 bits on parle de ottant "simple précision", on peut aussi le coder sur 64 bits en "double précision" suivant le même principe (1 bit de signes, 11 bits pour l'exposant et 52 bits pour la mantisse). C'est le cas de Python qui utilise de base 64 bits pour ses valeurs de type float.

EXERCICE 4 Trouver le nombre à virgule représenté par le mot :1 10000000 100100100000000000000002

(4)

EXERCICE 5 Représenter en binaire à virgule ottante le nombre 2,625.

3 Coder des textes

Code ASCII

L'idée du code ASCII (American Standard Code for Information Interchange), dont la première version date de 1975 est de représenter tous les caractères les plus courant (en langue anglaise !) par des nombres sur 7 bits.

Le code ASCII se base sur un tableau contenant les caractères les plus utilisés en langue anglaise : les lettres de l'alphabet en majuscule (de A à Z) et en minuscule (de a à z), les dix chires arabes (de 0 à 9), des signes de ponctuation (point, virgule, point-virgule, deux points, points d'exclamation et d'interrogation, apostrophe, guillemets, parenthèses, crochets etc.), quelques symboles et certains caractères spéciaux invisibles (espace, retour-chariot, tabulation, retour-arrière, etc.).

Les créateurs de ce code se limitèrent à 7 bits pour coder un caractère : celui-ci pouvait donc être stocké en mémoire sur un octet (8 bits), puisqu'ils réservaient toujours le 8ème bit pour le contrôle de parité (sécurité pour éviter les erreurs, qui étaient très fréquentes dans les premières mémoires électroniques).

Le 8e bit vaut 0 si le nombre de 1 dans les 7 premiers bits est pair et 1 sinon.

(5)

Norme ISO-8859-1 ou Latin-1

En ajoutant un bit supplémentaire pour coder les caractères (en supprimant le bit de parité), on s'ore plus de possibilité.

La norme ISO 88591 appelée aussi Latin-1 ou Europe occidentale est la première partie d'une norme plus complète appelée ISO 8859 (qui comprend 16 parties) et qui permet de coder tous les caractères des langues européennes. Cette norme ISO 88591 permet de coder 191 caractères de l'alphabet latin qui avaient à l'époque été jugés essentiels dans l'écriture, mais omet quelques caractères fort utiles (par exemple, la ligature ÷n'y gure pas).

Dans les pays occidentaux, cette norme est utilisée par de nombreux systèmes d'exploitation, dont Linux et Windows. Elle a donné lieu à quelques extensions et adaptations, dont Windows-1252 (appelée ANSI) et ISO 8859-15 (qui prend en compte le symboleecréé après la norme ISO 8859-1). C'est source de grande confusion pour les développeurs de programmes informatiques car un même caractère peut être codé diéremment suivant la norme utilisée... et les normes ne sont pas compatibles !

EXERCICE 6 Coder en binaire le message : On est mardi 20 ! (l'espace est le caractère STX, codé par le nombre 2)

EXERCICE 7 Écrire le texte codé par le code suivant : 01000010 01110010 01100001 01110110 01101111 00000010 11100000 00000010 01110100 01101111 01101001 00101100

(6)

UTF-8

Le problème d'une table ASCII étendue est qu'elle est spécique à un alphabet. Si on veut pouvoir inclure l'alphabet cyrillique, grec, chinois... il faudrait utiliser plusieurs octets pour coder un caractère et un texte prendrait beaucoup de places.

L'idée du système Unicode est de proposer un code qui s'adapte au monde entier (répertoire de 128 172 caractères couvrant une centaine d'écritures). Pour cela, le nombre d'octets sur lequel un caractère est codé peut varier ! 1 seul pour le caractère les plus courant et jusqu'à 4 pour les caractères utilisés moins fréquemment. Voici les règles qu'il respecte :

• Un texte en ASCII de base est codé de manière identique en UTF-8. On utilise un octet com- mençant par un bit 0 à gauche (bit de poids fort).

• Les octets ne sont pas remplis entièrement. Les bits de poids fort du premier octet forment une suite de 1 indiquant le nombre d' octets utilisés pour coder le caractère. Les octets suivants commencent tous par le bloc binaire 10.

• Dans la norme ISO 8859-1 le é est codé 1110 1001, en UTF-8 on le code sur deux octets en respectant les précisions apportées dans le tableau ci-dessus. Les bits imposés sont en gras, le code du é est écrit en commençant par la droite et l' octet de gauche est rempli par des zéros (en italique). Voilà ce que l'on obtient :

11000011 10101001

EXERCICE 8 Le symbole ecorrespond à la valeur décimale 8364.

1. Convertir cette valeur en binaire.

2. Combien d'octets doit-on utiliser en UTF-8 pour coder ce nombre convenablement (nombre entier d'octet) ?

3. Donner le codage UTF-8 correspondant.

Références

Documents relatifs

Le code ASCII a donc été étendu à 8 bits (un octet) pour pouvoir coder plus de caractères (on parle d'ailleurs de code ASCII

Question 3 : écrire en assembleur le sous-programme INITPORT initialisant les ports A et B en effectuant des accès aux registres en adressage direct.. Question 4 : écrire en

(pour l’anglais SHift Left) d´ecale tous les bits d’une position vers la gauche et place un z´ero comme bit le plus ` a droite. Lorsqu’il y a d´ebordement, l’indicateur

(pour l’anglais SHift Left) d´ecale tous les bits d’un registre ou d’une case m´emoire d’une position vers la gauche et place un z´ero comme bit le plus ` a droite, ce

La qualit´ e du g´ en´ erateur est ´ evalu´ ee au moyen du crit` ere qui stipule que le g´ en´ erateur est un bon g´ en´ erateur de nombres pseudo-al´ eatoires si on ne parvient

Norme de codage dont la limitation a été de coder un caractère par octet en utilisant un des bits comme contrôle de parité :. 2 7 = 128 valeurs possibles chacune étant associée

[r]

de telle sorte que la premi`ere moiti´e du tableau contienne des nombres plus petits que la deuxi`eme moiti´e.. t pointe successivement sur chacun des ´el´ements du bas du tableau