Mathématiques pour l'informatique 201-N11 • Cégep à Montréal

Exercices corrigés : systèmes de numération informatique (201-N11)

Voici la série d'exercices corrigés sur les systèmes de numération du cours Mathématiques pour l'informatique 201-N11, suivi au cégep par les étudiants en techniques et en sciences de l'informatique à Montréal. La partie A couvre les bases : les poids positionnels et la lecture d'un nombre dans sa base, les divisions et multiplications successives pour convertir depuis le décimal, l'arithmétique binaire posée, le complément à deux et sa plage asymétrique, puis le débordement et sa règle de détection. La partie B monte au niveau examen : l'hexadécimal comme écriture compacte du binaire avec les masques et les décalages, les codes ASCII, BCD, Gray et le bit de parité, un problème de couleurs d'écran et de capacité mémoire, et la construction complète d'un nombre en virgule flottante IEEE 754.

Le fil de la série : la base dit le poids de chaque position, donc convertir c'est peser. Chaque conversion se contrôle en refaisant la somme des poids, et ce contrôle attrape aussi bien l'erreur de sens de lecture des restes que le découpage en paquets fait par la gauche.

Les pièges désignés nommément dans les corrigés : croire qu'un motif de bits porte son interprétation avec lui, oublier que la plage signée est asymétrique parce que le zéro occupe une place, confondre la retenue non signée et le débordement signé, et penser que 0,10{,}1 finira par s'écrire exactement en binaire si on ajoute assez de bits.

Série autocorrigée Tape tes réponses sous chaque question : la page te dit juste ou faux avant d'ouvrir la correction. Avec un compte, chaque bonne réponse du premier coup rapporte des points.

Ce chapitre fait partie de Mathématiques pour l'informatique, 201-N11
Avant de commencer Fiche de révision : les pièges et la méthode de ce chapitre

Rappel de cours

  • En base bb, le chiffre de rang kk pèse bkb^{k} ; après la virgule, les poids sont b1,b2,b^{-1}, b^{-2}, \dots
  • Décimal vers base bb : divisions successives, restes lus DE BAS EN HAUT. Partie fractionnaire : multiplications successives, parties entières lues DE HAUT EN BAS.
  • Un chiffre hexadécimal vaut 4 bits, un chiffre octal vaut 3 bits. Découpage en paquets toujours à partir de la DROITE.
  • Sur nn bits non signés : de 00 à 2n12^{n}-1. En complément à deux : de 2n1-2^{n-1} à 2n112^{n-1}-1.
  • Complément à deux de xx : inverser tous les bits, puis ajouter 1. Le motif obtenu vaut 2nx2^{n}-x.
  • Débordement signé : les deux opérandes de même signe et le résultat de signe opposé. Deux opérandes de signes contraires ne débordent jamais.
  • ET pour éteindre des bits, OU pour les allumer, XOR pour les basculer.
  • Décalage de kk rangs à gauche : multiplication par 2k2^{k}. À droite : division entière par 2k2^{k}.
  • Un décimal fini n'a d'écriture binaire finie que si son dénominateur réduit est une puissance de 2.
  • IEEE 754 simple précision : 1 bit de signe, 8 bits d'exposant biaisé de 127, 23 bits de mantisse, avec un 1 implicite. Entiers exacts jusqu'à 2242^{24}.

Partie A : les bases (/70)

Exercice 1 : Poids positionnels : lire un nombre dans sa base

Dans une base bb, le chiffre de rang kk (compté à partir de la droite, en commençant à 0) pèse bkb^{k}. Convertir vers le décimal, c'est peser : on multiplie chaque chiffre par le poids de son rang et on additionne. La grille ci-dessous rappelle les huit poids d'un octet.

1286432168421bitspoids
  • a) Convertissez 10110110210110110_2 en décimal.
  • b) Convertissez 3578357_8 en décimal.
  • c) Convertissez 2F5162\text{F}5_{16} en décimal.
  • d) Convertissez 1101,10121101{,}101_2 en décimal.
  • e) Quel est le plus grand entier non signé représentable sur nn bits ? Sur 8 bits ? Sur 16 bits ?

Tape tes réponses, la page te dit juste ou faux 0/12

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) 182182
  • b) 239239
  • c) 757757
  • d) 13,62513{,}625
  • e) 2n12^{n}-1, soit 255255 sur 8 bits et 6553565\,535 sur 16 bits

a) On écrit les poids au-dessus des bits : 128,64,32,16,8,4,2,1128, 64, 32, 16, 8, 4, 2, 1. Les bits à 1 sont ceux de poids 128128, 3232, 1616, 44 et 22. Somme : 128+32+16+4+2=182128+32+16+4+2 = 182. Contrôle rapide : le bit de poids fort vaut 1, donc le nombre est au moins 128 ; le bit de poids faible vaut 0, donc le nombre est pair. 182 satisfait les deux.

b) En base 8, les poids sont 64,8,164, 8, 1. Donc 3578=3(64)+5(8)+7(1)=192+40+7=239357_8 = 3(64) + 5(8) + 7(1) = 192 + 40 + 7 = 239. Contrôle : le chiffre le plus grand utilisé est 7, ce qui est licite en base 8 ; un 8 ou un 9 dans une écriture octale serait une faute d'énoncé.

c) En base 16, les poids sont 256,16,1256, 16, 1, et F\text{F} vaut 15. Donc 2F516=2(256)+15(16)+5(1)=512+240+5=7572\text{F}5_{16} = 2(256) + 15(16) + 5(1) = 512 + 240 + 5 = 757. Les lettres A\text{A} à F\text{F} valent 10 à 15 : c'est la seule chose à mémoriser en hexadécimal.

d) La partie entière 110121101_2 vaut 8+4+1=138+4+1 = 13. Après la virgule, les poids deviennent des puissances négatives : 21=0,52^{-1} = 0{,}5, puis 22=0,252^{-2} = 0{,}25, puis 23=0,1252^{-3} = 0{,}125. Les bits sont 1,0,11, 0, 1, donc la partie fractionnaire vaut 0,5+0,125=0,6250{,}5 + 0{,}125 = 0{,}625. Total : 13,62513{,}625. La règle est la même de part et d'autre de la virgule, seul l'exposant change de signe.

e) Sur nn bits il y a 2n2^{n} combinaisons, numérotées de 0 à 2n12^{n}-1 : le plus grand entier non signé est donc 2n12^{n}-1. Sur 8 bits, 255255 ; sur 16 bits, 6553565\,535. Piège classique : répondre 2n2^{n} en oubliant que le zéro consomme une combinaison.

112806413211608141201bitspoids128 + 32 + 16 + 4 + 2 = 182

Exercice 2 : Du décimal vers les autres bases : divisions successives

Pour convertir un entier décimal vers la base bb, on divise à répétition par bb et on lit les restes DE BAS EN HAUT. Pour une partie fractionnaire, on multiplie à répétition par bb et on lit les parties entières DE HAUT EN BAS. Les deux algorithmes se ressemblent, mais le sens de lecture est inversé : c'est là que se perdent la moitié des points.

  • a) Convertissez 156 en binaire par divisions successives et vérifiez par les poids.
  • b) Convertissez 156 en octal, puis en hexadécimal.
  • c) Convertissez 0,68750{,}6875 en binaire.
  • d) Essayez de convertir 0,10{,}1 en binaire. Que se passe-t-il ?
  • e) Convertissez 1000 en hexadécimal.
  • f) Quelle conséquence la question d) a-t-elle sur un programme qui teste 0,1+0,2=0,30{,}1 + 0{,}2 = 0{,}3 ?

Tape tes réponses, la page te dit juste ou faux 0/14

a)
b)
c)
d)
e)
f)
Voir la correction

Réponses

  • a) 156=100111002156 = 10011100_2
  • b) 156=2348=9C16156 = 234_8 = 9\text{C}_{16}
  • c) 0,6875=0,101120{,}6875 = 0{,}1011_2
  • d) Développement périodique : 0,1=0,0001120{,}1 = 0{,}0\overline{0011}_2, jamais fini
  • e) 1000=3E8161000 = 3\text{E}8_{16}
  • f) On ne compare jamais deux flottants par une égalité stricte : on teste xy<ε|x-y| < \varepsilon, et l'argent se compte en cents, avec des entiers

a) 156=2(78)+0156 = 2(78) + 0 ; 78=2(39)+078 = 2(39)+0 ; 39=2(19)+139 = 2(19)+1 ; 19=2(9)+119 = 2(9)+1 ; 9=2(4)+19 = 2(4)+1 ; 4=2(2)+04 = 2(2)+0 ; 2=2(1)+02 = 2(1)+0 ; 1=2(0)+11 = 2(0)+1. Les restes lus de bas en haut donnent 10011100210011100_2. Vérification par les poids : 128+16+8+4=156128 + 16 + 8 + 4 = 156. Le contrôle par les poids est obligatoire, parce qu'il attrape l'erreur de sens de lecture, qui donnerait 0011100100111001.

b) Par divisions par 8 : 156=8(19)+4156 = 8(19)+4 ; 19=8(2)+319 = 8(2)+3 ; 2=8(0)+22 = 8(0)+2, d'où 2348234_8. Vérification : 2(64)+3(8)+4=128+24+4=1562(64)+3(8)+4 = 128+24+4 = 156. Par divisions par 16 : 156=16(9)+12156 = 16(9)+12 ; 9=16(0)+99 = 16(0)+9, et 12=C12 = \text{C}, d'où 9C169\text{C}_{16}. Vérification : 9(16)+12=1569(16)+12 = 156. Raccourci : 10011100210011100_2 se découpe en 1001 1100=9C1001\ 1100 = 9\text{C}, en paquets de 4 bits à partir de la droite.

c) 0,6875×2=1,3750{,}6875 \times 2 = 1{,}375, on garde 1 ; 0,375×2=0,750{,}375 \times 2 = 0{,}75, on garde 0 ; 0,75×2=1,50{,}75 \times 2 = 1{,}5, on garde 1 ; 0,5×2=1,00{,}5 \times 2 = 1{,}0, on garde 1, et il ne reste rien. Lecture de haut en bas : 0,101120{,}1011_2. Vérification : 0,5+0,125+0,0625=0,68750{,}5 + 0{,}125 + 0{,}0625 = 0{,}6875. La conversion s'arrête ici parce que 0,6875=11160{,}6875 = \dfrac{11}{16} a un dénominateur qui est une puissance de 2.

d) 0,1×2=0,20{,}1 \times 2 = 0{,}2 ; 0,2×2=0,40{,}2 \times 2 = 0{,}4 ; 0,4×2=0,80{,}4 \times 2 = 0{,}8 ; 0,8×2=1,60{,}8 \times 2 = 1{,}6 ; 0,6×2=1,20{,}6 \times 2 = 1{,}2 ; 0,2×2=0,40{,}2 \times 2 = 0{,}4 et l'on retombe sur un état déjà vu. Le développement est périodique : 0,1=0,0001120{,}1 = 0{,}0\overline{0011}_2, sans fin. La raison est arithmétique : 0,1=1100{,}1 = \dfrac{1}{10} et 10 contient le facteur 5, qui n'est pas une puissance de 2. Un nombre décimal fini n'a d'écriture binaire finie que si son dénominateur réduit est une puissance de 2.

e) 1000=16(62)+81000 = 16(62)+8 ; 62=16(3)+1462 = 16(3)+14, et 14=E14 = \text{E} ; 3=16(0)+33 = 16(0)+3. D'où 3E8163\text{E}8_{16}. Vérification : 3(256)+14(16)+8=768+224+8=10003(256) + 14(16) + 8 = 768 + 224 + 8 = 1000.

f) L'ordinateur ne stocke pas 0,10{,}1 mais l'arrondi de son développement binaire infini sur le nombre de bits disponibles. Trois arrondis distincts se produisent, pour 0,10{,}1, pour 0,20{,}2 et pour 0,30{,}3, et rien ne garantit que la somme des deux premiers tombe exactement sur le troisième : en pratique elle ne tombe pas. La conclusion tient en une règle : on ne compare jamais deux nombres à virgule flottante avec une égalité stricte, on teste xy<ε|x-y| < \varepsilon. Pour de l'argent, on travaille en cents avec des entiers.

Exercice 3 : Arithmétique binaire : additionner, soustraire, multiplier

Les quatre opérations se posent en binaire exactement comme en décimal, avec une table d'addition minuscule : 0+0=00+0=0, 0+1=10+1=1, 1+1=101+1=10, 1+1+1=111+1+1=11. La retenue se propage de la même manière. Chaque résultat doit être vérifié en décimal, sans exception.

  • a) Posez et calculez 101102+1101210110_2 + 1101_2.
  • b) Posez et calculez 1101012101102110101_2 - 10110_2.
  • c) Posez et calculez 10112×10121011_2 \times 101_2.
  • d) Effectuez la division 11012÷1021101_2 \div 10_2 et donnez le quotient et le reste.
  • e) Que devient un nombre binaire quand on lui ajoute un 0 à droite ? Trois zéros ?

Tape tes réponses, la page te dit juste ou faux 0/12

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) 1000112=35100011_2 = 35
  • b) 111112=3111111_2 = 31
  • c) 1101112=55110111_2 = 55
  • d) Quotient 1102=6110_2 = 6, reste 11
  • e) Un zéro multiplie par 2, trois zéros par 23=82^{3}=8

a) On aligne à droite : 1011010110 vaut 22 et 11011101 vaut 13. Colonne par colonne depuis la droite : 0+1=10+1 = 1 ; 1+0=11+0 = 1 ; 1+1=101+1 = 10, on pose 0 et on retient 1 ; 0+1+1=100+1+1 = 10, on pose 0 et on retient 1 ; 1+0+1=101+0+1 = 10, on pose 0 et on retient 1 ; il reste la retenue, on pose 1. Résultat : 1000112100011_2. Vérification : 32+2+1=3532+2+1 = 35 et 22+13=3522+13 = 35.

b) 110101110101 vaut 53 et 1011010110 vaut 22. On emprunte comme en décimal, un emprunt valant 2 dans la colonne de droite : 10=11-0 = 1 ; 010-1 impose un emprunt, 101=110-1 = 1 ; 010-1 après emprunt devient 1111-1-1, nouvel emprunt, 1011=010-1-1 = 0 ; et ainsi de suite. Résultat : 11111211111_2. Vérification : 16+8+4+2+1=3116+8+4+2+1 = 31 et 5322=3153-22 = 31. Un résultat en 1111111111 n'est pas suspect : c'est 2512^{5}-1.

c) 10111011 vaut 11 et 101101 vaut 5. La multiplication binaire ne demande aucune table : chaque bit du multiplicateur donne soit une copie décalée du multiplicande, soit une ligne de zéros. Ici : 10111011 (bit de poids 1), 000000000000 (bit de poids 2, nul), 101100101100 (bit de poids 4, donc décalé de deux rangs). Somme : 1011+101100=11011121011 + 101100 = 110111_2. Vérification : 32+16+4+2+1=5532+16+4+2+1 = 55 et 11×5=5511 \times 5 = 55.

d) 11011101 vaut 13 et 1010 vaut 2. Diviser par 10210_2, c'est décaler d'un rang vers la droite : le quotient est 1102=6110_2 = 6 et le bit expulsé, ici 1, est le reste. Vérification : 2(6)+1=132(6)+1 = 13. Diviser par une puissance de 2 est un décalage, ce qui explique pourquoi les compilateurs remplacent n/2n/2 par un décalage quand nn est un entier non signé.

e) Ajouter un 0 à droite décale tous les bits d'un rang vers la gauche : chaque bit voit son poids doubler, donc le nombre est multiplié par 2, et non par 10. Trois zéros multiplient par 23=82^{3} = 8. C'est le même mécanisme qu'en décimal, où ajouter un zéro multiplie par 10, c'est-à-dire par la base. Retenir : le facteur est toujours la base, jamais dix.

Exercice 4 : Le complément à deux : représenter les nombres négatifs

Sur nn bits, le complément à deux représente les négatifs sans signe séparé : x-x s'écrit comme le motif de 2nx2^{n}-x. Le bit de poids fort joue alors le rôle d'indicateur de signe, et l'addition ordinaire continue de fonctionner sans aucune modification du circuit. La roue ci-dessous montre les 16 motifs de 4 bits : avancer d'un cran ajoute 1, et l'on repasse par le haut sans discontinuité.

00000000110010200113010040101501106011171000-81001-71010-61011-51100-41101-31110-21111-1un cran = +1dehors : les 4 bits dedans : la valeur signee
  • a) Écrivez 37-37 en complément à deux sur 8 bits, en détaillant les deux étapes.
  • b) Le motif 1011010010110100 est lu comme un entier signé sur 8 bits. Quelle est sa valeur ?
  • c) Quelle est la plage des entiers signés sur 8 bits ? Pourquoi n'est-elle pas symétrique ?
  • d) Calculez 453745 - 37 en n'utilisant qu'une addition sur 8 bits.
  • e) Sur 4 bits, quel est l'opposé de 8-8 ? Que révèle ce cas ?

Tape tes réponses, la page te dit juste ou faux 0/13

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) 37=110110112=DB16-37 = 11011011_2 = \text{DB}_{16}, dont la lecture non signée vaut 219=25637219 = 256-37
  • b) 76-76
  • c) De 128-128 à +127+127 : le zéro occupe un motif du côté positif
  • d) 45+110110112=845 + 11011011_2 = 8, la retenue sortante étant jetée
  • e) L'opposé de 8-8 est 8-8 : la négation n'est pas totale

a) Étape 1 : écrire 3737 sur 8 bits. 37=32+4+137 = 32+4+1, donc 0010010100100101. Étape 2 : inverser tous les bits, ce qui donne 1101101011011010, puis ajouter 1 : 1101101111011011. Contrôle numérique : 1101101111011011 vaut 128+64+16+8+2+1=219128+64+16+8+2+1 = 219, et 219=25637219 = 256 - 37, ce qui est exactement la définition. En hexadécimal, DB\text{DB}.

b) Le bit de poids fort vaut 1, donc le nombre est négatif. Deux méthodes. Méthode directe : lire le motif comme non signé, 10110100=128+32+16+4=18010110100 = 128+32+16+4 = 180, puis retrancher 256256 : 180256=76180 - 256 = -76. Méthode par complément : inverser, 0100101101001011, ajouter 1, 01001100=64+8+4=7601001100 = 64+8+4 = 76, donc le motif valait 76-76. Les deux donnent le même résultat, et c'est le contrôle à faire.

c) De 128-128 à +127+127. Il y a 256256 motifs ; la moitié, ceux dont le bit de poids fort vaut 0, code 00 à 127127 ; l'autre moitié code 128-128 à 1-1. L'asymétrie vient de ce que le zéro occupe une place du côté positif : il reste 127127 motifs pour les positifs et 128128 pour les négatifs. C'est précisément l'avantage du complément à deux sur les représentations avec bit de signe séparé, qui ont deux zéros et perdent un motif.

d) 45=0010110145 = 00101101. On lui ajoute la représentation de 37-37, soit 1101101111011011. L'addition binaire donne 1000010001\,00001000 sur neuf colonnes : la retenue sortante du rang 8 est simplement jetée, et il reste 00001000=800001000 = 8. Vérification : 4537=845-37 = 8. C'est tout l'intérêt du complément à deux : le circuit d'addition sert aussi de circuit de soustraction, à un inverseur près.

e) Sur 4 bits, la plage est 8-8 à +7+7. L'opposé de 8-8 devrait être +8+8, qui n'existe pas dans la plage. En appliquant la recette : 8-8 s'écrit 10001000 ; on inverse, 01110111 ; on ajoute 1, 10001000 : on retombe sur 8-8. Le cas révèle que la négation en complément à deux n'est pas totale, et c'est un vrai piège de programmation, où x\lvert x \rvert peut renvoyer un nombre négatif pour la borne inférieure de la plage.

Exercice 5 : Laboratoire en base 8 : de la notation développée à la multiplication posée

L'octal n'a que huit chiffres, de 0 à 7, et chaque position pèse une puissance de 8. Tout ce que vous savez faire en base 10 se refait en base 8 avec un seul changement : on retient dès que l'on atteint 8, on emprunte 8 et non 10. Cet exercice reprend, en octal, le parcours complet du laboratoire de calcul binaire : écrire un nombre en notation développée, le convertir dans les deux sens, l'additionner, le soustraire, le multiplier, puis boucler par un aller-retour contrôlé en décimal. Chaque résultat se vérifie en repassant par le décimal, et c'est ce contrôle qui fait la différence entre un calcul juste et un calcul qui a l'air juste.

Tables à connaître ou à reconstruire au brouillon : 81=88^{1} = 8, 82=648^{2} = 64, 83=5128^{3} = 512, 84=40968^{4} = 4096, et les inverses 81=0,1258^{-1} = 0{,}125, 82=0,0156258^{-2} = 0{,}015625.

  • a) Écrivez 2471,3582471{,}35_8 en notation développée, comme une somme de produits de ses chiffres par des puissances décroissantes de 8, puis donnez sa valeur décimale.
  • b) Convertissez en décimal : 7358735_8, 120481204_8, 61,4861{,}4_8 et 0,5280{,}52_8.
  • c) Convertissez en octal : 200200, 10001000, 93,7593{,}75 et 0,10{,}1. Que se passe-t-il pour le dernier ?
  • d) Posez et calculez les additions octales 3578+2468357_8 + 246_8, 17458+6338+2781745_8 + 633_8 + 27_8 et 12,568+7,37812{,}56_8 + 7{,}37_8.
  • e) On travaille sur 4 chiffres octaux. Définissez le complément à 7 et le complément à 8 d'un nombre, calculez le complément à 8 de 032580325_8, puis utilisez-le pour effectuer 24618032582461_8 - 0325_8 par une addition. Quelle est la plage des entiers signés sur 4 chiffres octaux, et à quoi reconnaît-on un nombre négatif ?
  • f) Posez et calculez les soustractions octales 70428356787042_8 - 3567_8 et 10,283,75810{,}2_8 - 3{,}75_8, en détaillant les emprunts.
  • g) Posez et calculez les multiplications octales 538×7853_8 \times 7_8, 1248×358124_8 \times 35_8 et 6,48×2,286{,}4_8 \times 2{,}2_8.
  • h) Convertissez les deux nombres en octal, effectuez l'opération en octal, puis revenez en décimal pour contrôler : 345+219345 + 219 et 6,5×3,256{,}5 \times 3{,}25.
  • i) Sous Linux, la commande chmod 755 fixe les droits d'un fichier. Écrivez 7558755_8 en binaire et expliquez ce que chaque chiffre octal représente. Pourquoi l'octal est-il la base naturelle de ce codage ?

Tape tes réponses, la page te dit juste ou faux 0/32

a)
b)
c)
d)
e)
f)
g)
h)
i)
Voir la correction

Réponses

  • a) 283+482+78+1+381+582=1337,4531252\cdot 8^{3}+4\cdot 8^{2}+7\cdot 8+1+3\cdot 8^{-1}+5\cdot 8^{-2} = 1337{,}453125
  • b) 477477, 644644, 49,549{,}5 et 0,656250{,}65625
  • c) 3108310_8, 175081750_8, 135,68135{,}6_8 ; 0,1=0,0631480{,}1 = 0{,}0\overline{6314}_8, périodique
  • d) 6258625_8, 262782627_8 et 22,15822{,}15_8
  • e) Complément à 8 de 032580325_8 : 745387453_8 ; 2461803258=213482461_8-0325_8 = 2134_8 ; plage 2048-2048 à 20472047, négatif dès que le chiffre de tête atteint 4
  • f) 325383253_8 et 4,2384{,}23_8
  • g) 4558455_8, 460484604_8 et 16,5816{,}5_8
  • h) 5318+3338=10648=564531_8+333_8 = 1064_8 = 564 ; 6,48×3,28=25,18=21,1256{,}4_8 \times 3{,}2_8 = 25{,}1_8 = 21{,}125
  • i) 7558=111 101 1012755_8 = 111\ 101\ 101_2 : trois acteurs, trois bits chacun, lecture, écriture, exécution

a) La virgule sépare les rangs positifs des rangs négatifs. À gauche, en partant de la virgule vers la gauche, les poids sont 80,81,82,838^{0}, 8^{1}, 8^{2}, 8^{3} ; à droite, 818^{-1} puis 828^{-2}. D'où 2471,358=283+482+781+180+381+5822471{,}35_8 = 2 \cdot 8^{3} + 4 \cdot 8^{2} + 7 \cdot 8^{1} + 1 \cdot 8^{0} + 3 \cdot 8^{-1} + 5 \cdot 8^{-2}. Valeur : 2(512)+4(64)+7(8)+1+38+564=1024+256+56+1+0,375+0,078125=1337,4531252(512) + 4(64) + 7(8) + 1 + \dfrac{3}{8} + \dfrac{5}{64} = 1024 + 256 + 56 + 1 + 0{,}375 + 0{,}078125 = 1337{,}453125. La notation développée n'est pas un exercice de style : c'est la définition même de la base, et toute conversion vers le décimal n'est que ce calcul écrit plus vite.

b) 7358=7(64)+3(8)+5=448+24+5=477735_8 = 7(64) + 3(8) + 5 = 448 + 24 + 5 = 477. 12048=1(512)+2(64)+0(8)+4=512+128+4=6441204_8 = 1(512) + 2(64) + 0(8) + 4 = 512 + 128 + 4 = 644 : le zéro se pèse aussi, il tient une position même s'il n'apporte rien. 61,48=6(8)+1+48=49,561{,}4_8 = 6(8) + 1 + \dfrac{4}{8} = 49{,}5. 0,528=58+264=0,625+0,03125=0,656250{,}52_8 = \dfrac{5}{8} + \dfrac{2}{64} = 0{,}625 + 0{,}03125 = 0{,}65625. Piège classique : lire 0,5280{,}52_8 comme « cinquante-deux centièmes ». En base 8, le deuxième chiffre après la virgule pèse un soixante-quatrième, pas un centième.

c) Partie entière par divisions successives par 8, restes lus de bas en haut. 200=8(25)+0200 = 8(25) + 0 ; 25=8(3)+125 = 8(3) + 1 ; 3=8(0)+33 = 8(0) + 3, d'où 200=3108200 = 310_8 ; contrôle 3(64)+1(8)=2003(64) + 1(8) = 200. 1000=8(125)+01000 = 8(125) + 0 ; 125=8(15)+5125 = 8(15) + 5 ; 15=8(1)+715 = 8(1) + 7 ; 1=8(0)+11 = 8(0) + 1, d'où 1000=175081000 = 1750_8 ; contrôle 512+7(64)+5(8)=512+448+40=1000512 + 7(64) + 5(8) = 512 + 448 + 40 = 1000. Pour 93,7593{,}75, on sépare : 93=8(11)+593 = 8(11) + 5 ; 11=8(1)+311 = 8(1) + 3 ; 1=8(0)+11 = 8(0) + 1, donc 93=135893 = 135_8 ; puis 0,75×8=6,00{,}75 \times 8 = 6{,}0, on garde 6 et il ne reste rien, donc 93,75=135,6893{,}75 = 135{,}6_8. Contrôle : 64+24+5+0,75=93,7564 + 24 + 5 + 0{,}75 = 93{,}75. Pour 0,10{,}1 : 0,1×8=0,80{,}1 \times 8 = 0{,}8, chiffre 0 ; 0,8×8=6,40{,}8 \times 8 = 6{,}4, chiffre 6 ; 0,4×8=3,20{,}4 \times 8 = 3{,}2, chiffre 3 ; 0,2×8=1,60{,}2 \times 8 = 1{,}6, chiffre 1 ; 0,6×8=4,80{,}6 \times 8 = 4{,}8, chiffre 4 ; 0,8×8=6,40{,}8 \times 8 = 6{,}4 et l'on retombe sur un état déjà vu. Le développement est périodique : 0,1=0,0631480{,}1 = 0{,}0\overline{6314}_8. Rien d'étonnant : 0,1=1100{,}1 = \dfrac{1}{10} et 10 contient le facteur 5, qui ne divise aucune puissance de 8. Un décimal fini a une écriture finie en base 8 exactement quand son dénominateur réduit est une puissance de 2, la même condition qu'en binaire, parce que 8=238 = 2^{3}.

d) On additionne colonne par colonne, et dès qu'une colonne atteint 8 on écrit le reste et on retient 1. Première addition : unités 7+6=13=8+57 + 6 = 13 = 8 + 5, on pose 5 et on retient 1 ; huitaines 5+4+1=10=8+25 + 4 + 1 = 10 = 8 + 2, on pose 2 et on retient 1 ; 3+2+1=63 + 2 + 1 = 6. Résultat 6258625_8. Contrôle décimal : 3578=239357_8 = 239, 2468=166246_8 = 166, somme 405, et 6258=6(64)+2(8)+5=405625_8 = 6(64) + 2(8) + 5 = 405. Deuxième addition, à trois termes, alignés à droite : unités 5+3+7=15=8+75 + 3 + 7 = 15 = 8 + 7, on pose 7 et on retient 1 ; 4+3+2+1=104 + 3 + 2 + 1 = 10, on pose 2, retenue 1 ; 7+6+0+1=147 + 6 + 0 + 1 = 14, on pose 6, retenue 1 ; 1+0+0+1=21 + 0 + 0 + 1 = 2. Résultat 262782627_8. Contrôle : 997+411+23=1431997 + 411 + 23 = 1431 et 26278=2(512)+6(64)+2(8)+7=14312627_8 = 2(512) + 6(64) + 2(8) + 7 = 1431. Troisième addition, à virgule, en alignant les virgules : 6+7=136 + 7 = 13, on pose 5, retenue 1 ; 5+3+1=95 + 3 + 1 = 9, on pose 1, retenue 1 ; 2+7+1=102 + 7 + 1 = 10, on pose 2, retenue 1 ; 1+0+1=21 + 0 + 1 = 2. Résultat 22,15822{,}15_8. Contrôle : 10,71875+7,484375=18,20312510{,}71875 + 7{,}484375 = 18{,}203125 et 22,158=18+18+564=18,20312522{,}15_8 = 18 + \dfrac{1}{8} + \dfrac{5}{64} = 18{,}203125. L'erreur la plus fréquente est de retenir à 10 par réflexe : 7+67 + 6 donne alors « 13 » posé tel quel, et le résultat est faux de 8 sur cette colonne.

e) Le complément à 7 d'un nombre à 4 chiffres octaux s'obtient en remplaçant chaque chiffre dd par 7d7 - d, sans aucune retenue ; c'est l'analogue de l'inversion des bits. Le complément à 8 est le complément à 7 plus 1, et il vaut 84x=4096x8^{4} - x = 4096 - x : c'est l'analogue du complément à deux. Pour 032580325_8 : complément à 7, chiffre par chiffre, 70,73,72,757-0, 7-3, 7-2, 7-5, soit 745287452_8 ; plus 1, 745387453_8. Contrôle : 03258=3(64)+2(8)+5=2130325_8 = 3(64) + 2(8) + 5 = 213, 4096213=38834096 - 213 = 3883, et 74538=7(512)+4(64)+5(8)+3=3584+256+40+3=38837453_8 = 7(512) + 4(64) + 5(8) + 3 = 3584 + 256 + 40 + 3 = 3883. Soustraction par addition : 24618+745382461_8 + 7453_8. Unités 1+3=41 + 3 = 4 ; 6+5=11=8+36 + 5 = 11 = 8 + 3, on pose 3, retenue 1 ; 4+4+1=94 + 4 + 1 = 9, on pose 1, retenue 1 ; 2+7+1=102 + 7 + 1 = 10, on pose 2, retenue 1. On obtient 12134812134_8 sur cinq chiffres ; la retenue qui sort à gauche est jetée, puisque l'on travaille sur 4 chiffres, et il reste 213482134_8. Contrôle : 24618=13292461_8 = 1329, 1329213=11161329 - 213 = 1116, et 21348=1024+64+24+4=11162134_8 = 1024 + 64 + 24 + 4 = 1116. Pourquoi ça marche : ajouter 4096x4096 - x puis jeter 40964096 revient exactement à retrancher xx. Plage signée sur 4 chiffres octaux, c'est-à-dire 12 bits : de 211=2048-2^{11} = -2048 à 2111=20472^{11} - 1 = 2047, soit de 400084000_8 (lu 2048-2048) à 377783777_8. Un nombre est négatif quand son chiffre de tête vaut 4 ou plus : la moitié haute des motifs représente les négatifs, exactement comme le bit de poids fort en binaire, puisque le premier chiffre octal contient ce bit. Ainsi 745387453_8, lu comme un entier signé, vaut 38834096=2133883 - 4096 = -213.

f) Première soustraction, 70428356787042_8 - 3567_8. Unités : 2<72 < 7, on emprunte une huitaine, 2+87=32 + 8 - 7 = 3, et le chiffre des huitaines passe de 4 à 3. Huitaines : 3<63 < 6, on emprunte, 3+86=53 + 8 - 6 = 5, et le chiffre des 64 doit baisser de 1 ; il vaut 0, donc on emprunte d'abord aux 512, qui passent de 7 à 6, et les 64 valent 81=78 - 1 = 7. Colonne des 64 : 75=27 - 5 = 2. Colonne des 512 : 63=36 - 3 = 3. Résultat 325383253_8. Contrôle : 70428=36187042_8 = 3618, 35678=19113567_8 = 1911, différence 1707, et 32538=3(512)+2(64)+5(8)+3=17073253_8 = 3(512) + 2(64) + 5(8) + 3 = 1707. Deuxième soustraction, 10,2083,75810{,}20_8 - 3{,}75_8, en complétant 10,210{,}2 par un zéro pour aligner : soixante-quatrièmes 0<50 < 5, on emprunte, 0+85=30 + 8 - 5 = 3, et les huitièmes passent de 2 à 1 ; huitièmes 1<71 < 7, on emprunte, 1+87=21 + 8 - 7 = 2, et les unités, qui valent 0, empruntent aux huitaines, 101 \to 0, pour valoir 81=78 - 1 = 7 ; unités 73=47 - 3 = 4 ; huitaines 00=00 - 0 = 0. Résultat 4,2384{,}23_8. Contrôle : 8,253,953125=4,2968758{,}25 - 3{,}953125 = 4{,}296875 et 4,238=4+28+364=4,2968754{,}23_8 = 4 + \dfrac{2}{8} + \dfrac{3}{64} = 4{,}296875. Le piège de l'emprunt en cascade, à travers un zéro, est le même qu'en décimal ; la seule nouveauté est qu'un emprunt vaut 8.

g) Multiplication posée, avec la table de 8 en tête : chaque produit partiel se réduit modulo 8 et la retenue peut dépasser 1. 538×7853_8 \times 7_8 : 3×7=21=2(8)+53 \times 7 = 21 = 2(8) + 5, on pose 5 et on retient 2 ; 5×7+2=37=4(8)+55 \times 7 + 2 = 37 = 4(8) + 5, on pose 5 puis 4. Résultat 4558455_8 ; contrôle 43×7=301=4(64)+5(8)+543 \times 7 = 301 = 4(64) + 5(8) + 5. 1248×358124_8 \times 35_8 : par 5, 4×5=20=2(8)+44 \times 5 = 20 = 2(8) + 4, on pose 4, retenue 2 ; 2×5+2=12=8+42 \times 5 + 2 = 12 = 8 + 4, on pose 4, retenue 1 ; 1×5+1=61 \times 5 + 1 = 6, ligne 6448644_8. Par 3, décalée d'un rang : 4×3=124 \times 3 = 12, on pose 4, retenue 1 ; 2×3+1=72 \times 3 + 1 = 7 ; 1×3=31 \times 3 = 3, ligne 374083740_8. Somme 6448+37408644_8 + 3740_8 : 4+0=44 + 0 = 4 ; 4+4=84 + 4 = 8, on pose 0, retenue 1 ; 6+7+1=146 + 7 + 1 = 14, on pose 6, retenue 1 ; 3+1=43 + 1 = 4. Résultat 460484604_8 ; contrôle 84×29=2436=4(512)+6(64)+484 \times 29 = 2436 = 4(512) + 6(64) + 4. 6,48×2,286{,}4_8 \times 2{,}2_8 : on multiplie sans les virgules, 648×22864_8 \times 22_8, et l'on replace ensuite autant de chiffres après la virgule qu'il y en avait au total dans les facteurs, ici 1+1=21 + 1 = 2. 648×2=150864_8 \times 2 = 150_8 (car 4×2=84 \times 2 = 8, on pose 0, retenue 1 ; 6×2+1=136 \times 2 + 1 = 13, on pose 5, retenue 1) ; la ligne par 2 décalée donne 150081500_8 ; somme 165081650_8 ; avec deux chiffres fractionnaires, 16,508=16,5816{,}50_8 = 16{,}5_8. Contrôle : 6,5×2,25=14,6256{,}5 \times 2{,}25 = 14{,}625 et 16,58=14+58=14,62516{,}5_8 = 14 + \dfrac{5}{8} = 14{,}625. La règle de placement de la virgule est la même qu'en décimal, parce qu'elle ne dépend que du nombre de rangs, pas de la base.

h) 345=8(43)+1345 = 8(43) + 1, 43=8(5)+343 = 8(5) + 3, 5=8(0)+55 = 8(0) + 5, donc 345=5318345 = 531_8 ; 219=8(27)+3219 = 8(27) + 3, 27=8(3)+327 = 8(3) + 3, donc 219=3338219 = 333_8. Addition : 1+3=41 + 3 = 4 ; 3+3=63 + 3 = 6 ; 5+3=85 + 3 = 8, on pose 0, retenue 1, et l'on écrit 1 en tête. Résultat 106481064_8, et retour : 512+6(8)+4=564=345+219512 + 6(8) + 4 = 564 = 345 + 219. Le contrôle ferme la boucle. Puis 6,5=6,486{,}5 = 6{,}4_8 puisque 0,5=480{,}5 = \dfrac{4}{8}, et 3,25=3,283{,}25 = 3{,}2_8 puisque 0,25=280{,}25 = \dfrac{2}{8}. On calcule 648×32864_8 \times 32_8 : par 2, 1508150_8 ; par 3 décalée, 6×3=18=2(8)+26 \times 3 = 18 = 2(8) + 2 précédé de 4×3=12=8+44 \times 3 = 12 = 8 + 4, ce qui donne 2348234_8 puis 234082340_8 ; somme 1508+23408=25108150_8 + 2340_8 = 2510_8 ; deux chiffres fractionnaires : 25,108=25,1825{,}10_8 = 25{,}1_8. Retour : 2(8)+5+18=21,1252(8) + 5 + \dfrac{1}{8} = 21{,}125, et 6,5×3,25=21,1256{,}5 \times 3{,}25 = 21{,}125. Les deux nombres ont des écritures octales finies parce que leurs parties fractionnaires, 12\dfrac{1}{2} et 14\dfrac{1}{4}, ont un dénominateur puissance de 2.

i) Chaque chiffre octal vaut exactement 3 bits : 7=11127 = 111_2, 5=10125 = 101_2, donc 7558=111 101 1012755_8 = 111\ 101\ 101_2. Les trois chiffres codent les droits de trois acteurs, le propriétaire, le groupe et les autres, et les trois bits de chaque chiffre sont, dans l'ordre, lecture, écriture, exécution. 7=1117 = 111 : le propriétaire peut tout ; 5=1015 = 101 : le groupe et les autres peuvent lire et exécuter, pas écrire. La base 8 est naturelle ici parce que les droits vont par paquets de 3 bits et qu'un chiffre octal est précisément un paquet de 3 bits : le découpage ne demande aucun calcul, il se lit. Un 644, pour comparaison, donne 110 100 100110\ 100\ 100 : le propriétaire lit et écrit, les autres lisent seulement. Voilà pourquoi la conversion binaire vers octal se fait en paquets de 3 et pourquoi l'octal survit là où l'on manipule des triplets de bits.

Exercice 6 : Laboratoire en base 16 : de la notation développée à la multiplication posée

L'hexadécimal a seize chiffres : de 0 à 9, puis A, B, C, D, E, F pour 10 à 15. Chaque position pèse une puissance de 16, on retient dès que l'on atteint 16, on emprunte 16. C'est la base de tout ce qui s'affiche en informatique, adresses mémoire, couleurs, octets d'un fichier, parce qu'un chiffre hexadécimal vaut exactement 4 bits et qu'un octet tient en deux chiffres. Cet exercice reprend en base 16 le parcours complet du laboratoire : notation développée, conversions dans les deux sens, addition, complément, soustraction, multiplication, aller-retour contrôlé.

Tables à avoir sous la main : 162=25616^{2} = 256, 163=409616^{3} = 4096, 164=6553616^{4} = 65536, 161=0,062516^{-1} = 0{,}0625, 162=0,0039062516^{-2} = 0{,}00390625, et la table des produits de deux chiffres hexadécimaux se reconstruit en décimal puis se réduit modulo 16.

  • a) Écrivez 3AF,C8163\text{AF}{,}\text{C}8_{16} en notation développée, puis donnez sa valeur décimale.
  • b) Convertissez en décimal : 2B162\text{B}_{16}, 7D0167\text{D}0_{16}, FFFF16\text{FFFF}_{16}, A,416\text{A}{,}4_{16} et 0,18160{,}18_{16}.
  • c) Convertissez en hexadécimal : 255255, 40964096, 30003000, 0,81250{,}8125 et 0,10{,}1. Que remarquez-vous pour le dernier ?
  • d) Posez et calculez les additions hexadécimales 3C16+2F163\text{C}_{16} + 2\text{F}_{16}, A9F16+7E516\text{A}9\text{F}_{16} + 7\text{E}5_{16} et 1F,816+C,A161\text{F}{,}8_{16} + \text{C}{,}\text{A}_{16}.
  • e) On travaille sur 4 chiffres hexadécimaux. Définissez le complément à 15 et le complément à 16, calculez le complément à 16 de 02D41602\text{D}4_{16}, puis utilisez-le pour effectuer 1A7B1602D4161\text{A}7\text{B}_{16} - 02\text{D}4_{16} par une addition. Quel lien avec le complément à deux sur 16 bits, et à quoi reconnaît-on un nombre négatif ?
  • f) Posez et calculez les soustractions hexadécimales B05164C916\text{B}05_{16} - 4\text{C}9_{16} et 10,4167,C1610{,}4_{16} - 7{,}\text{C}_{16}, en détaillant les emprunts.
  • g) Posez et calculez les multiplications hexadécimales 2A16×B162\text{A}_{16} \times \text{B}_{16}, 1F16×3C161\text{F}_{16} \times 3\text{C}_{16} et 4,816×2,4164{,}8_{16} \times 2{,}4_{16}.
  • h) Convertissez les deux nombres en hexadécimal, effectuez l'opération en hexadécimal, puis revenez en décimal pour contrôler : 10002551000 - 255 et 12,75×2,512{,}75 \times 2{,}5.

Tape tes réponses, la page te dit juste ou faux 0/33

a)
b)
c)
d)
e)
f)
g)
h)
Voir la correction

Réponses

  • a) 3162+1016+15+12161+8162=943,781253\cdot 16^{2}+10\cdot 16+15+12\cdot 16^{-1}+8\cdot 16^{-2} = 943{,}78125
  • b) 4343, 20002000, 6553565\,535, 10,2510{,}25 et 0,093750{,}09375
  • c) FF16\text{FF}_{16}, 1000161000_{16}, BB816\text{BB}8_{16}, 0,D160{,}\text{D}_{16} ; 0,1=0,19160{,}1 = 0{,}1\overline{9}_{16}, périodique
  • d) 6B166\text{B}_{16}, 1284161284_{16} et 2C,2162\text{C}{,}2_{16}
  • e) Complément à 16 de 02D41602\text{D}4_{16} : FD2C16\text{FD}2\text{C}_{16} ; la différence vaut 17A716=605517\text{A}7_{16} = 6055 ; plage 32768-32\,768 à 3276732\,767, négatif dès que le chiffre de tête atteint 8
  • f) 63C1663\text{C}_{16} et 8,8168{,}8_{16}
  • g) 1CE161\text{CE}_{16}, 74416744_{16} et A,216\text{A}{,}2_{16}
  • h) 2E916=7452\text{E}9_{16} = 745 et 1F,E16=31,8751\text{F}{,}\text{E}_{16} = 31{,}875

a) Les poids, de la virgule vers la gauche, sont 160,161,16216^{0}, 16^{1}, 16^{2} ; vers la droite, 161,16216^{-1}, 16^{-2}. D'où 3AF,C816=3162+10161+15160+12161+81623\text{AF}{,}\text{C}8_{16} = 3 \cdot 16^{2} + 10 \cdot 16^{1} + 15 \cdot 16^{0} + 12 \cdot 16^{-1} + 8 \cdot 16^{-2}, en remplaçant A, F et C par leurs valeurs 10, 15 et 12. Valeur : 3(256)+10(16)+15+1216+8256=768+160+15+0,75+0,03125=943,781253(256) + 10(16) + 15 + \dfrac{12}{16} + \dfrac{8}{256} = 768 + 160 + 15 + 0{,}75 + 0{,}03125 = 943{,}78125. La seule difficulté nouvelle par rapport à l'octal est de ne pas oublier que A vaut 10 et non 1, et que F vaut 15 et non 6.

b) 2B16=2(16)+11=432\text{B}_{16} = 2(16) + 11 = 43. 7D016=7(256)+13(16)+0=1792+208=20007\text{D}0_{16} = 7(256) + 13(16) + 0 = 1792 + 208 = 2000. FFFF16=15(4096)+15(256)+15(16)+15=61440+3840+240+15=65535\text{FFFF}_{16} = 15(4096) + 15(256) + 15(16) + 15 = 61440 + 3840 + 240 + 15 = 65535, et plus vite : quatre chiffres tous au maximum valent 1641=6553516^{4} - 1 = 65535, le plus grand entier sur 16 bits. A,416=10+416=10,25\text{A}{,}4_{16} = 10 + \dfrac{4}{16} = 10{,}25. 0,1816=116+8256=0,0625+0,03125=0,093750{,}18_{16} = \dfrac{1}{16} + \dfrac{8}{256} = 0{,}0625 + 0{,}03125 = 0{,}09375. Même piège que pour l'octal : 0,18160{,}18_{16} n'a rien de « dix-huit centièmes », le deuxième chiffre pèse un deux-cent-cinquante-sixième.

c) 255=16(15)+15255 = 16(15) + 15, 15=16(0)+1515 = 16(0) + 15, deux restes 15, soit FF16\text{FF}_{16} ; contrôle 15(16)+15=25515(16) + 15 = 255, l'octet plein. 4096=1634096 = 16^{3}, donc 1000161000_{16} : un 1 suivi de trois zéros, comme 1000=1031000 = 10^{3} en décimal. 3000=16(187)+83000 = 16(187) + 8 ; 187=16(11)+11187 = 16(11) + 11 ; 11=16(0)+1111 = 16(0) + 11 ; restes lus de bas en haut, 11,11,811, 11, 8, soit BB816\text{BB}8_{16} ; contrôle 11(256)+11(16)+8=2816+176+8=300011(256) + 11(16) + 8 = 2816 + 176 + 8 = 3000. 0,8125×16=13,00{,}8125 \times 16 = 13{,}0, chiffre D, et il ne reste rien : 0,8125=0,D160{,}8125 = 0{,}\text{D}_{16}, ce qui est cohérent avec 0,8125=13160{,}8125 = \dfrac{13}{16}. Pour 0,10{,}1 : 0,1×16=1,60{,}1 \times 16 = 1{,}6, chiffre 1 ; 0,6×16=9,60{,}6 \times 16 = 9{,}6, chiffre 9 ; 0,6×16=9,60{,}6 \times 16 = 9{,}6, chiffre 9, et ainsi de suite. Donc 0,1=0,19160{,}1 = 0{,}1\overline{9}_{16}, périodique. C'est la même impossibilité qu'en binaire et en octal, et pour la même raison : 16=2416 = 2^{4}, donc un décimal a une écriture finie en base 16 si et seulement si il en a une en base 2, c'est-à-dire si son dénominateur réduit est une puissance de 2. Le dixième, avec son facteur 5, n'en fera jamais partie. On lit d'ailleurs le binaire 0,0001120{,}0\overline{0011}_2 à travers l'hexadécimal : 1=00011 = 0001, 9=10019 = 1001, et la concaténation 0001 1001 10010001\ 1001\ 1001\dots redonne bien le motif 00110011 répété, décalé d'un rang.

d) 3C16+2F163\text{C}_{16} + 2\text{F}_{16} : unités C+F=12+15=27=16+11\text{C} + \text{F} = 12 + 15 = 27 = 16 + 11, on pose B et on retient 1 ; 3+2+1=63 + 2 + 1 = 6. Résultat 6B166\text{B}_{16} ; contrôle 60+47=107=6(16)+1160 + 47 = 107 = 6(16) + 11. A9F16+7E516\text{A}9\text{F}_{16} + 7\text{E}5_{16} : F+5=20=16+4\text{F} + 5 = 20 = 16 + 4, on pose 4, retenue 1 ; 9+E+1=9+14+1=24=16+89 + \text{E} + 1 = 9 + 14 + 1 = 24 = 16 + 8, on pose 8, retenue 1 ; A+7+1=18=16+2\text{A} + 7 + 1 = 18 = 16 + 2, on pose 2, retenue 1, écrite en tête. Résultat 1284161284_{16} ; contrôle 2719+2021=4740=4096+2(256)+8(16)+42719 + 2021 = 4740 = 4096 + 2(256) + 8(16) + 4. 1F,816+C,A161\text{F}{,}8_{16} + \text{C}{,}\text{A}_{16}, virgules alignées : 8+A=18=16+28 + \text{A} = 18 = 16 + 2, on pose 2, retenue 1 ; F+C+1=15+12+1=28=16+12\text{F} + \text{C} + 1 = 15 + 12 + 1 = 28 = 16 + 12, on pose C, retenue 1 ; 1+0+1=21 + 0 + 1 = 2. Résultat 2C,2162\text{C}{,}2_{16} ; contrôle 31,5+12,625=44,125=2(16)+12+21631{,}5 + 12{,}625 = 44{,}125 = 2(16) + 12 + \dfrac{2}{16}. La méthode sûre pour chaque colonne : additionner en décimal, retrancher 16 si l'on dépasse 15, puis traduire le reste en chiffre hexadécimal. Le piège est de poser « 27 » ou « 11 » au lieu de B.

e) Le complément à 15 d'un nombre à 4 chiffres hexadécimaux remplace chaque chiffre dd par 15d15 - d : c'est l'inversion des bits, puisque 15d15 - d inverse les 4 bits de dd. Le complément à 16 ajoute 1 au résultat et vaut 164x=65536x16^{4} - x = 65536 - x. Pour 02D41602\text{D}4_{16} : complément à 15, F0,F2,FD,F4\text{F}-0, \text{F}-2, \text{F}-\text{D}, \text{F}-4, soit FD2B16\text{FD}2\text{B}_{16} ; plus 1, FD2C16\text{FD}2\text{C}_{16}. Contrôle : 02D416=2(256)+13(16)+4=72402\text{D}4_{16} = 2(256) + 13(16) + 4 = 724, 65536724=6481265536 - 724 = 64812, et FD2C16=15(4096)+13(256)+2(16)+12=61440+3328+32+12=64812\text{FD}2\text{C}_{16} = 15(4096) + 13(256) + 2(16) + 12 = 61440 + 3328 + 32 + 12 = 64812. Soustraction par addition : 1A7B16+FD2C161\text{A}7\text{B}_{16} + \text{FD}2\text{C}_{16}. B+C=23=16+7\text{B} + \text{C} = 23 = 16 + 7, on pose 7, retenue 1 ; 7+2+1=107 + 2 + 1 = 10, on pose A ; A+D=23\text{A} + \text{D} = 23, on pose 7, retenue 1 ; 1+F+1=17=16+11 + \text{F} + 1 = 17 = 16 + 1, on pose 1, retenue 1. On obtient 117A716117\text{A}7_{16} ; on jette la retenue sortante, il reste 17A71617\text{A}7_{16}. Contrôle : 1A7B16=67791\text{A}7\text{B}_{16} = 6779, 6779724=60556779 - 724 = 6055, et 17A716=4096+7(256)+10(16)+7=605517\text{A}7_{16} = 4096 + 7(256) + 10(16) + 7 = 6055. Lien avec le complément à deux : 4 chiffres hexadécimaux, c'est 16 bits, et FD2C16\text{FD}2\text{C}_{16} est exactement le motif de 724-724 en complément à deux sur 16 bits ; le complément à 16 n'est pas une autre opération, c'est le complément à deux écrit en base 16, quatre bits à la fois. Plage signée : de 800016=327688000_{16} = -32768 à 7FFF16=327677\text{FFF}_{16} = 32767. Un nombre est négatif quand son chiffre de tête vaut 8 ou plus, parce que ce chiffre contient le bit de poids fort ; ainsi FD2C16\text{FD}2\text{C}_{16} lu signé vaut 6481265536=72464812 - 65536 = -724.

f) B05164C916\text{B}05_{16} - 4\text{C}9_{16}. Unités : 5<95 < 9, on emprunte 16, 5+169=125 + 16 - 9 = 12, on pose C, et le chiffre des seizaines doit baisser de 1 ; il vaut 0, donc on emprunte aux 256, B devient A, et les seizaines valent 161=15=F16 - 1 = 15 = \text{F}. Seizaines : FC=1512=3\text{F} - \text{C} = 15 - 12 = 3. Centaines de 256 : A4=6\text{A} - 4 = 6. Résultat 63C1663\text{C}_{16}. Contrôle : B0516=2821\text{B}05_{16} = 2821, 4C916=12254\text{C}9_{16} = 1225, différence 1596, et 63C16=6(256)+3(16)+12=159663\text{C}_{16} = 6(256) + 3(16) + 12 = 1596. 10,4167,C1610{,}4_{16} - 7{,}\text{C}_{16} : seizièmes 4<C4 < \text{C}, on emprunte, 4+1612=84 + 16 - 12 = 8, et les unités, qui valent 0, empruntent au 1 de gauche pour valoir F ; unités F7=8\text{F} - 7 = 8 ; le 1 de tête est devenu 0. Résultat 8,8168{,}8_{16}. Contrôle : 16,257,75=8,5=8+81616{,}25 - 7{,}75 = 8{,}5 = 8 + \dfrac{8}{16}. L'emprunt vaut 16, et l'emprunt en cascade à travers un zéro laisse un F derrière lui, comme il laisse un 9 en décimal et un 7 en octal.

g) 2A16×B162\text{A}_{16} \times \text{B}_{16} : A×B=10×11=110=6(16)+14\text{A} \times \text{B} = 10 \times 11 = 110 = 6(16) + 14, on pose E et on retient 6 ; 2×B+6=28=16+122 \times \text{B} + 6 = 28 = 16 + 12, on pose C, retenue 1, écrite en tête. Résultat 1CE161\text{CE}_{16} ; contrôle 42×11=462=256+12(16)+1442 \times 11 = 462 = 256 + 12(16) + 14. Notez la retenue de 6 : en base 16, une retenue de multiplication va jusqu'à 14, ce qui déroute quand on ne retient que des 1 par habitude. 1F16×3C161\text{F}_{16} \times 3\text{C}_{16} : par C, F×C=180=11(16)+4\text{F} \times \text{C} = 180 = 11(16) + 4, on pose 4, retenue 11 ; 1×C+11=23=16+71 \times \text{C} + 11 = 23 = 16 + 7, on pose 7, retenue 1, ligne 17416174_{16}. Par 3, décalée : F×3=45=2(16)+13\text{F} \times 3 = 45 = 2(16) + 13, on pose D, retenue 2 ; 1×3+2=51 \times 3 + 2 = 5, ligne 5D0165\text{D}0_{16}. Somme 17416+5D016174_{16} + 5\text{D}0_{16} : 4+0=44 + 0 = 4 ; 7+D=20=16+47 + \text{D} = 20 = 16 + 4, on pose 4, retenue 1 ; 1+5+1=71 + 5 + 1 = 7. Résultat 74416744_{16} ; contrôle 31×60=1860=7(256)+4(16)+431 \times 60 = 1860 = 7(256) + 4(16) + 4. 4,816×2,4164{,}8_{16} \times 2{,}4_{16} : on calcule 4816×241648_{16} \times 24_{16} puis on replace deux chiffres fractionnaires. Par 4 : 8×4=32=2(16)+08 \times 4 = 32 = 2(16) + 0, on pose 0, retenue 2 ; 4×4+2=18=16+24 \times 4 + 2 = 18 = 16 + 2, on pose 2, retenue 1, ligne 12016120_{16}. Par 2 décalée : 8×2=168 \times 2 = 16, on pose 0, retenue 1 ; 4×2+1=94 \times 2 + 1 = 9, ligne 90016900_{16}. Somme A2016\text{A}20_{16}, donc A,2016=A,216\text{A}{,}20_{16} = \text{A}{,}2_{16}. Contrôle : 4,5×2,25=10,125=10+2164{,}5 \times 2{,}25 = 10{,}125 = 10 + \dfrac{2}{16}.

h) 1000=16(62)+81000 = 16(62) + 8, 62=16(3)+1462 = 16(3) + 14, 3=16(0)+33 = 16(0) + 3, donc 1000=3E8161000 = 3\text{E}8_{16} ; et 255=FF16255 = \text{FF}_{16}, que l'on écrit 0FF160\text{FF}_{16} pour aligner. Soustraction 3E8160FF163\text{E}8_{16} - 0\text{FF}_{16} : unités 8<F8 < \text{F}, on emprunte, 8+1615=98 + 16 - 15 = 9, et E devient D ; seizaines D<F\text{D} < \text{F}, on emprunte, 13+1615=14=E13 + 16 - 15 = 14 = \text{E}, et 3 devient 2 ; 20=22 - 0 = 2. Résultat 2E9162\text{E}9_{16} ; retour 2(256)+14(16)+9=512+224+9=745=10002552(256) + 14(16) + 9 = 512 + 224 + 9 = 745 = 1000 - 255. Puis 12,75=C,C1612{,}75 = \text{C}{,}\text{C}_{16}, puisque 12=C12 = \text{C} et 0,75=12160{,}75 = \dfrac{12}{16}, et 2,5=2,8162{,}5 = 2{,}8_{16} puisque 0,5=8160{,}5 = \dfrac{8}{16}. On calcule CC16×2816\text{CC}_{16} \times 28_{16}. Par 8 : C×8=96=6(16)+0\text{C} \times 8 = 96 = 6(16) + 0, on pose 0, retenue 6 ; C×8+6=102=6(16)+6\text{C} \times 8 + 6 = 102 = 6(16) + 6, on pose 6, retenue 6, ligne 66016660_{16}. Par 2 décalée : C×2=24=16+8\text{C} \times 2 = 24 = 16 + 8, on pose 8, retenue 1 ; C×2+1=25=16+9\text{C} \times 2 + 1 = 25 = 16 + 9, on pose 9, retenue 1, ligne 1980161980_{16}. Somme 66016+198016660_{16} + 1980_{16} : 0+0=00 + 0 = 0 ; 6+8=14=E6 + 8 = 14 = \text{E} ; 6+9=15=F6 + 9 = 15 = \text{F} ; 0+1=10 + 1 = 1. Résultat 1FE0161\text{FE}0_{16}, et avec deux chiffres fractionnaires 1F,E016=1F,E161\text{F}{,}\text{E}0_{16} = 1\text{F}{,}\text{E}_{16}. Retour : 16+15+1416=31,87516 + 15 + \dfrac{14}{16} = 31{,}875, et 12,75×2,5=31,87512{,}75 \times 2{,}5 = 31{,}875. La boucle est fermée : quand l'aller-retour tombe juste, la conversion et le calcul posé sont validés d'un coup, et quand il ne tombe pas juste, l'erreur est dans l'un des deux, ce qui se localise vite en revérifiant d'abord les deux conversions.

Exercice 7 : Débordement : quand le résultat ne tient plus

Un débordement se produit quand le résultat exact d'une opération sort de la plage représentable. La machine ne s'arrête pas : elle rend le motif tronqué, qui est faux. Il faut donc savoir DÉTECTER la situation, et ne pas confondre la retenue sortante, qui concerne l'arithmétique non signée, avec le débordement, qui concerne l'arithmétique signée.

  • a) Sur 8 bits signés, calculez 100+50100 + 50. Que donne la machine ?
  • b) Énoncez la règle qui détecte un débordement signé à partir des signes des opérandes et du résultat.
  • c) Sur 8 bits non signés, calculez 200+100200 + 100. Que donne la machine ?
  • d) (100)+(50)(-100) + (-50) sur 8 bits signés déborde-t-il ?
  • e) 100+(50)100 + (-50) sur 8 bits signés peut-il déborder ? Justifiez sans calculer.

Tape tes réponses, la page te dit juste ou faux 0/8

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) La machine rend 106-106 : débordement, car 150>127150 > 127
  • b) Débordement signé si et seulement si les deux opérandes ont le même signe et le résultat le signe opposé
  • c) La machine garde 4444 et lève la retenue sortante : retenue non signée, pas débordement signé
  • d) Oui : 150<128-150 < -128, le motif obtenu vaut 106106
  • e) Non : signes contraires, la somme est comprise entre 50-50 et 100100

a) 100=01100100100 = 01100100 et 50=0011001050 = 00110010. L'addition donne 1001011010010110. Le bit de poids fort vaut 1 : lu en signé, le résultat vaut 150256=106150 - 256 = -106. On additionne deux nombres positifs et on obtient un négatif : c'est un débordement. La valeur exacte, 150150, dépasse le plafond 127127, et la roue du complément à deux montre pourquoi : en avançant de 50 crans depuis 100, on franchit la frontière entre 127127 et 128-128.

b) Règle : il y a débordement signé exactement lorsque les deux opérandes ont le MÊME signe et que le résultat porte le signe opposé. Deux nombres de signes contraires ne peuvent jamais déborder, puisque leur somme est comprise entre les deux. Le processeur implante cette règle par un XOR entre la retenue entrante et la retenue sortante du bit de poids fort, ce qui donne le même verdict.

c) 200+100=300200 + 100 = 300, or le plafond non signé sur 8 bits est 255255. La machine garde 300256=44300 - 256 = 44 et lève la retenue sortante. Le motif conservé est 0010110000101100. Ici il n'y a pas de débordement signé au sens de la règle b) : il y a une retenue non signée. Les deux indicateurs, la retenue et le débordement, sont calculés simultanément par le processeur, et c'est le programme qui choisit lequel regarder selon le type déclaré des variables.

d) 100-100 et 50-50 ont le même signe, et leur somme exacte 150-150 est inférieure au plancher 128-128 : il y a débordement. Le motif obtenu correspond à 150+256=106-150 + 256 = 106, un positif. On retrouve la règle : deux négatifs qui donnent un positif.

e) Non. Les opérandes sont de signes contraires, donc leur somme est comprise entre 50-50 et 100100, c'est-à-dire strictement à l'intérieur de la plage [128,127][-128, 127]. C'est un raisonnement d'encadrement, pas un calcul : la somme d'un positif et d'un négatif est toujours située entre les deux, donc dans la plage dès que les deux opérandes y sont. Un débordement à l'addition signée est donc toujours détectable au seul examen des signes.

-1280100127-106+27+23on sort a droite, on rentre a gauche

Partie B : problemes et raisonnement (/50)

Exercice 8 : Hexadécimal, masques et opérations bit à bit

L'hexadécimal n'est pas une base de calcul : c'est une écriture compacte du binaire. Un chiffre hexadécimal vaut exactement 4 bits, un chiffre octal exactement 3 bits, ce qui rend les conversions immédiates par découpage en paquets, à partir de la DROITE. Les opérations bit à bit, elles, agissent sur chaque rang indépendamment, sans aucune retenue.

  • a) Convertissez 101111101110111121011111011101111_2 en hexadécimal, puis en octal.
  • b) On note ET\text{ET} l'opération bit à bit. Que donne B616\text{B6}_{16} ET 0F16\text{0F}_{16} ? Et B616\text{B6}_{16} ET F016\text{F0}_{16} ?
  • c) Quelle opération force à 1 le bit de rang 2 sans toucher aux autres ? Quelle opération l'inverse ?
  • d) Que valent 101121011_2 décalé de 3 rangs à gauche, puis de 2 rangs à droite ?
  • e) Comment tester la parité d'un entier avec une seule opération bit à bit ?
  • f) Pourquoi la conversion binaire vers octal se fait-elle en paquets de 3 et non de 4 ?

Tape tes réponses, la page te dit juste ou faux 0/16

a)
b)
c)
d)
e)
f)
Voir la correction

Réponses

  • a) BEEF16=1373578=48879\text{BEEF}_{16} = 137357_8 = 48\,879
  • b) 66 et B016=176\text{B}0_{16} = 176, dont la somme redonne 182182
  • c) OU avec 0000010000000100 pour allumer, XOR avec le même masque pour basculer
  • d) 8888 puis 2222
  • e) nn ET 11 vaut 0
  • f) Parce que 8=238 = 2^{3} : un chiffre octal vaut 3 bits, un chiffre hexadécimal 4

a) Découpage en paquets de 4 depuis la droite : 1011 1110 1110 11111011\ 1110\ 1110\ 1111, soit B,E,E,F\text{B}, \text{E}, \text{E}, \text{F} : le nombre s'écrit BEEF16\text{BEEF}_{16}. Vérification par les poids : 11(4096)+14(256)+14(16)+15=45056+3584+224+15=4887911(4096) + 14(256) + 14(16) + 15 = 45056 + 3584 + 224 + 15 = 48\,879. Pour l'octal, on redécoupe le MÊME binaire en paquets de 3 depuis la droite, en complétant à gauche par un zéro : 1 011 111 011 101 1111\ 011\ 111\ 011\ 101\ 111, soit 1373578137357_8. Vérification : 1(32768)+3(4096)+7(512)+3(64)+5(8)+7=488791(32768)+3(4096)+7(512)+3(64)+5(8)+7 = 48\,879. Le découpage doit impérativement partir de la droite ; partir de la gauche est l'erreur la plus fréquente et elle décale tout.

b) B616=101101102=182\text{B6}_{16} = 10110110_2 = 182. Le masque 0F=00001111\text{0F} = 00001111 garde les 4 bits de poids faible et annule les autres : le résultat est 00000110=600000110 = 6. Le masque F0=11110000\text{F0} = 11110000 garde les 4 bits de poids fort : le résultat est 10110000=B016=17610110000 = \text{B0}_{16} = 176. Contrôle : 176+6=182176 + 6 = 182, les deux moitiés recomposent l'octet. Un ET sert toujours à ÉTEINDRE des bits.

c) Pour forcer un bit à 1 sans toucher aux autres, on fait un OU avec un masque qui ne porte un 1 qu'à ce rang : ici OU 00000100\text{OU}\ 00000100. Pour inverser ce seul bit, on fait un XOR avec le même masque, puisque x1=xx \oplus 1 = \overline{x} et x0=xx \oplus 0 = x. Trois rôles à retenir : ET pour éteindre, OU pour allumer, XOR pour basculer.

d) 10112=111011_2 = 11. Décalé de 3 rangs à gauche : 10110002=881011000_2 = 88, soit 11×2311 \times 2^{3}. Ce résultat décalé de 2 rangs à droite donne 101102=2210110_2 = 22, soit 88÷488 \div 4. Attention, le décalage à droite est une division ENTIÈRE : les bits expulsés sont perdus, et 1111 décalé à droite de 1 rang donne 5, pas 5,55{,}5.

e) Un entier est pair si et seulement si son bit de rang 0 vaut 0, donc le test s'écrit : nn ET 11 vaut 0. Une seule opération, contre une division et un reste pour le test nmod2=0n \bmod 2 = 0. C'est l'optimisation classique, et elle reste correcte pour les entiers négatifs en complément à deux, puisque le bit de rang 0 y garde la même signification.

f) Parce qu'un chiffre de base bb code exactement log2b\log_{2}b bits : 16=2416 = 2^{4} donne 4 bits par chiffre hexadécimal, et 8=238 = 2^{3} donne 3 bits par chiffre octal. Le découpage n'est valable que parce que la base est une puissance de 2 ; il n'existe aucun découpage analogue vers la base 10, et c'est pour cela que la conversion binaire vers décimal exige des divisions ou des poids.

Exercice 9 : Codes informatiques : ASCII, BCD, Gray et parité

Un code n'est pas une base : c'est une convention qui associe un motif de bits à un symbole ou à un chiffre. Le même motif 0100000101000001 vaut 65, ou la lettre A, ou tout autre chose, selon le code appliqué. Un motif de bits ne porte jamais son interprétation avec lui.

  • a) La lettre A vaut 65 en ASCII. Écrivez son motif sur 8 bits. La lettre a vaut 97 : que vaut la différence, et où se voit-elle dans le motif ?
  • b) Écrivez 47 en BCD, puis en binaire pur. Comparez le nombre de bits utilisés.
  • c) Le code de Gray sur 3 bits est 000,001,011,010,110,111,101,100000, 001, 011, 010, 110, 111, 101, 100. Quelle propriété vérifie-t-il ? Donnez la règle de conversion depuis le binaire.
  • d) On protège l'octet 10110111011011 par un bit de parité paire. Quel bit ajoute-t-on ?
  • e) Ce code détecte-t-il deux erreurs simultanées ? Corrige-t-il une erreur ?

Tape tes réponses, la page te dit juste ou faux 0/15

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) A vaut 0100000101000001, a vaut 0110000101100001 : seul le bit de rang 5 change, d'où l'écart de 3232
  • b) 0100 01110100\ 0111 sur 8 bits en BCD, 1011112101111_2 sur 6 bits en binaire pur
  • c) Un seul bit change entre deux codes consécutifs ; le bit de Gray de rang kk est le XOR des bits binaires de rangs kk et k+1k+1
  • d) Le bit de parité vaut 1, le mot transmis est 1011011110110111
  • e) Il détecte une erreur simple, pas deux erreurs, et ne corrige rien

a) 65=64+165 = 64 + 1, donc A s'écrit 0100000101000001. Et 97=64+32+197 = 64+32+1, donc a s'écrit 0110000101100001. La différence vaut 32=2532 = 2^{5} : le seul bit qui change est celui de rang 5. Passer d'une majuscule à sa minuscule revient donc à forcer ce bit à 1, et l'inverse à l'éteindre. C'est pourquoi une mise en minuscules se code historiquement par un simple OU avec 0010000000100000, sans aucune table.

b) En BCD, chaque chiffre décimal est codé séparément sur 4 bits : le 4 devient 01000100, le 7 devient 01110111, donc 4747 s'écrit 0100 01110100\ 0111, soit 8 bits. En binaire pur, 47=32+8+4+2+1=101111247 = 32+8+4+2+1 = 101111_2, soit 6 bits. Le BCD gaspille de la place, puisqu'il n'utilise que 10 des 16 motifs de chaque quartet, mais il rend l'affichage immédiat, chiffre par chiffre. On le trouve encore dans les afficheurs, les horloges et certains formats financiers, où la conversion exacte vers le décimal prime sur la compacité.

c) Deux codes consécutifs ne diffèrent que par un seul bit, y compris entre le dernier et le premier. La règle de conversion : le bit de rang kk du code de Gray est le XOR du bit de rang kk et du bit de rang k+1k+1 de l'écriture binaire. Par exemple 5=10125 = 101_2 donne un premier bit 10=11 \oplus 0 = 1, un deuxième 01=10 \oplus 1 = 1, un troisième 10=11 \oplus 0 = 1, soit 111111, qui est bien le sixième mot de la liste. L'intérêt est physique : sur un capteur de position, si deux bits changeaient en même temps, un décalage de lecture entre eux produirait une valeur intermédiaire absurde. Avec Gray, il n'y a jamais qu'un bit en transition.

d) Le mot 10110111011011 contient cinq 1, un nombre impair. Pour que le total soit pair, le bit de parité vaut 1, et le mot transmis devient 1011011110110111, qui contient six 1. Contrôle à la réception : on recompte les 1 ; s'ils sont en nombre impair, une erreur s'est produite.

e) Il détecte toute erreur portant sur un nombre IMPAIR de bits, donc une erreur simple, mais pas deux erreurs simultanées : deux bits inversés laissent la parité inchangée et l'erreur passe inaperçue. Et il ne corrige rien, puisqu'il signale seulement qu'une erreur existe, sans dire où. Corriger demande davantage de redondance, par exemple un code de Hamming, qui ajoute plusieurs bits de contrôle placés de façon à désigner la position du bit fautif.

Exercice 10 : Cinq affirmations à corriger

Chacune des cinq affirmations suivantes est FAUSSE. Dites pourquoi et donnez l'énoncé correct.

  • 1) « En binaire, ajouter un 0 à droite multiplie le nombre par 10. »
  • 2) « Sur 8 bits, le complément à deux représente les entiers de 127-127 à +127+127. »
  • 3) « Le motif 1111111111111111 vaut 1-1. »
  • 4) « Un octet s'écrit avec quatre chiffres hexadécimaux. »
  • 5) « Avec assez de bits, on finit par écrire 0,10{,}1 exactement en binaire. »

Tape tes réponses, la page te dit juste ou faux 0/11

1)
2)
3)
4)
5)
Voir la correction

Réponses

  • 1) FAUX : la base vaut 2, donc le facteur est 2. 1012=5101_2 = 5 devient 10102=101010_2 = 10
  • 2) FAUX : la plage est [128;127][-128\,;127], soit [2n1;2n11][-2^{n-1}\,;2^{n-1}-1]
  • 3) FAUX : 1-1 en signé, 255255 en non signé. Le type est fixé par le programme, pas par la mémoire
  • 4) FAUX : un octet s'écrit avec DEUX chiffres hexadécimaux, de 0000 à FF\text{FF}
  • 5) FAUX : 0,10{,}1 n'a aucune écriture binaire finie, le facteur 5 du dénominateur l'interdit

1) FAUX. Ajouter un zéro à droite multiplie par la BASE, et la base est 2. Contre-exemple : 1012=5101_2 = 5 devient 10102=101010_2 = 10, soit le double, pas dix fois plus. Énoncé correct : en base bb, ajouter un zéro à droite multiplie par bb ; en binaire, par 2, et kk zéros multiplient par 2k2^{k}.

2) FAUX. La plage est 128-128 à +127+127 : elle est asymétrique, parce que le zéro consomme un motif du côté positif. Compter les motifs suffit à le voir : 128128 motifs pour les négatifs, 128128 pour le zéro et les positifs. Énoncé correct : sur nn bits, le complément à deux couvre [2n1, 2n11][-2^{n-1},\ 2^{n-1}-1].

3) FAUX. Le motif ne porte pas son interprétation : 1111111111111111 vaut 1-1 s'il est lu comme un entier signé sur 8 bits, mais 255255 s'il est lu comme un entier non signé. Il vaut encore autre chose s'il est lu comme un caractère ou comme une portion de nombre à virgule flottante. Énoncé correct : la valeur d'un motif dépend du type déclaré, et c'est le programme, pas la mémoire, qui fixe ce type.

4) FAUX. Un chiffre hexadécimal vaut 4 bits, donc un octet de 8 bits s'écrit avec exactement DEUX chiffres hexadécimaux, de 0000 à FF\text{FF}. Quatre chiffres hexadécimaux décrivent 16 bits, soit deux octets. Énoncé correct : nn bits demandent n/4n/4 chiffres hexadécimaux, arrondis vers le haut.

5) FAUX. 0,1=1100{,}1 = \dfrac{1}{10} et 10=2×510 = 2 \times 5 contient le facteur 5. Un nombre n'a d'écriture binaire finie que si son dénominateur réduit est une puissance de 2 : le développement de 0,10{,}1 est périodique et ajouter des bits ne fait que repousser l'arrondi. Énoncé correct : 0,10{,}1 n'admet aucune écriture binaire finie, quel que soit le nombre de bits ; c'est la raison pour laquelle 0,1+0,20{,}1+0{,}2 ne vaut pas exactement 0,30{,}3 en machine.

Exercice 11 : Problème : couleurs, mémoire et taille d'une image

Une couleur d'écran s'écrit en hexadécimal sous la forme #RRVVBB : deux chiffres hexadécimaux par composante, rouge, vert et bleu, chaque composante tenant sur un octet. Une image matricielle stocke une telle couleur par pixel.

  • a) Décomposez la couleur #3C78D8\#3\text{C}78\text{D}8 en ses trois composantes décimales.
  • b) Combien de couleurs distinctes ce codage permet-il ?
  • c) Un bus d'adresses compte 16 fils. Combien d'octets peut-on adresser ?
  • d) Quelle place occupe une image de 800 pixels sur 600 en couleurs 24 bits, en octets puis en mébioctets ?
  • e) Le même bus de 16 fils suffit-il à adresser cette image ? Combien de fils faudrait-il ?
  • f) La couleur #FFFFFF\#\text{FFFFFF} est-elle le blanc ou le noir ? Et #000000\#000000 ?

Tape tes réponses, la page te dit juste ou faux 0/15

a)
b)
c)
d)
e)
f)
Voir la correction

Réponses

  • a) (60;120;216)(60\,;120\,;216)
  • b) 2563=224=16777216256^{3} = 2^{24} = 16\,777\,216 couleurs
  • c) 216=655362^{16} = 65\,536 octets, soit 64 Kio
  • d) 480000480\,000 pixels, 14400001\,440\,000 octets, environ 1,371{,}37 Mio
  • e) Non : il faut 21 fils, puisque 220<14400002212^{20} < 1\,440\,000 \le 2^{21}
  • f) #FFFFFF\#\text{FFFFFF} est le blanc, #000000\#000000 le noir : la synthèse d'un écran est additive

a) On découpe en trois paires : 3C3\text{C}, 7878, D8\text{D}8. Rouge : 3(16)+12=603(16)+12 = 60. Vert : 7(16)+8=1207(16)+8 = 120. Bleu : 13(16)+8=21613(16)+8 = 216. La couleur est donc (60,120,216)(60, 120, 216), un bleu franc, ce que confirme la dominance de la composante bleue.

b) Chaque composante prend 256256 valeurs, et les trois sont indépendantes : 2563=224=16777216256^{3} = 2^{24} = 16\,777\,216 couleurs. C'est le fameux « 16 millions de couleurs », et le calcul se fait en additionnant les bits, 8+8+8=248+8+8 = 24, plutôt qu'en multipliant trois fois 256.

c) Avec 16 fils d'adresse, on forme 216=655362^{16} = 65\,536 adresses distinctes, soit 64 kibioctets si chaque adresse désigne un octet. Chaque fil supplémentaire double la capacité adressable : c'est un doublement, pas une addition, et c'est pourquoi le passage de 32 à 64 bits d'adressage n'a pas doublé mais rendu inatteignable la limite.

d) L'image compte 800×600=480000800 \times 600 = 480\,000 pixels, à 3 octets chacun : 14400001\,440\,000 octets. Un mébioctet valant 220=10485762^{20} = 1\,048\,576 octets, cela fait 1440000/10485761,371\,440\,000 / 1\,048\,576 \approx 1{,}37 Mio. Contrôle d'ordre de grandeur : un demi-million de pixels à 3 octets, c'est environ un million et demi d'octets, donc un peu plus d'un mébioctet.

e) Non : 6553665\,536 adresses ne suffisent pas pour 14400001\,440\,000 octets. Il faut nn tel que 2n14400002^{n} \ge 1\,440\,000. Comme 220=10485762^{20} = 1\,048\,576 est trop petit et 221=20971522^{21} = 2\,097\,152 convient, il faut 21 fils d'adresse. On raisonne par encadrement entre deux puissances de 2, jamais par division.

f) #FFFFFF\#\text{FFFFFF} met les trois composantes à leur maximum, 255255 : c'est le blanc, la somme des trois lumières. #000000\#000000 les met à zéro : aucune lumière émise, c'est le noir. La synthèse est additive parce qu'un écran émet de la lumière ; sur du papier, l'encre absorbe et la logique s'inverse, ce qui explique que le blanc y soit l'absence d'encre.

Exercice 12 : Problème : la norme IEEE 754 en simple précision

Un nombre à virgule flottante en simple précision tient sur 32 bits : 1 bit de signe, 8 bits d'exposant biaisé de 127127, et 23 bits de mantisse. Le nombre s'écrit (1)s×1,m×2e127(-1)^{s} \times 1{,}m \times 2^{e-127} : le 1 de tête n'est pas stocké, puisqu'il est toujours là après normalisation.

  • a) Écrivez 6,256{,}25 en binaire.
  • b) Normalisez cette écriture sous la forme 1,m×2k1{,}m \times 2^{k}.
  • c) Calculez l'exposant biaisé, puis donnez les 32 bits de 6,25-6{,}25.
  • d) Écrivez ces 32 bits en hexadécimal.
  • e) Quel est le plus grand entier représentable exactement en simple précision ?
  • f) Deux nombres flottants voisins sont-ils séparés par un écart constant ?

Tape tes réponses, la page te dit juste ou faux 0/14

a)
b)
c)
d)
e)
f)
Voir la correction

Réponses

  • a) 6,25=110,0126{,}25 = 110{,}01_2
  • b) 1,10012×221{,}1001_2 \times 2^{2}
  • c) Exposant stocké 129129, signe 1 : 1 10000001 100100000000000000000001\ 10000001\ 10010000000000000000000
  • d) C0C8000016\text{C0C80000}_{16}
  • e) 224=167772162^{24} = 16\,777\,216
  • f) Non : l'écart vaut 223×2k2^{-23}\times 2^{k}, il croît avec l'ordre de grandeur

a) Partie entière : 6=11026 = 110_2. Partie fractionnaire : 0,25=220{,}25 = 2^{-2}, donc 0101 après la virgule. D'où 6,25=110,0126{,}25 = 110{,}01_2. Vérification : 4+2+0,25=6,254 + 2 + 0{,}25 = 6{,}25.

b) On décale la virgule de deux rangs vers la gauche, ce qui compense par un facteur 222^{2} : 110,012=1,10012×22110{,}01_2 = 1{,}1001_2 \times 2^{2}. Vérification : 1,10012=1+0,5+0,0625=1,56251{,}1001_2 = 1 + 0{,}5 + 0{,}0625 = 1{,}5625, et 1,5625×4=6,251{,}5625 \times 4 = 6{,}25. La normalisation impose exactement un 1 avant la virgule, ce qui rend l'écriture unique et permet de ne pas stocker ce 1.

c) L'exposant réel vaut 22, donc l'exposant stocké vaut 2+127=129=1000000122 + 127 = 129 = 10000001_2. Le signe est négatif, donc s=1s = 1. La mantisse est la partie qui suit la virgule, 10011001, complétée par des zéros jusqu'à 23 bits. Les 32 bits sont : 1 10000001 100100000000000000000001\ 10000001\ 10010000000000000000000. Contrôle numérique : lu comme un entier non signé, ce motif vaut 231+129×223+222+219=32343326722^{31} + 129 \times 2^{23} + 2^{22} + 2^{19} = 3\,234\,332\,672.

d) On regroupe les 32 bits en paquets de 4 depuis la gauche, ce qui est licite puisque 32 est un multiple de 4 : 1100 0000 1100 1000 0000 0000 0000 00001100\ 0000\ 1100\ 1000\ 0000\ 0000\ 0000\ 0000, soit C0C8000016\text{C0C80000}_{16}. Contrôle : C0C80000\text{C0C80000} vaut bien 32343326723\,234\,332\,672, la même valeur qu'à la question précédente.

e) La mantisse compte 23 bits stockés plus le 1 implicite, soit 24 bits significatifs. Tous les entiers jusqu'à 224=167772162^{24} = 16\,777\,216 s'écrivent donc exactement. Au delà, un entier sur deux seulement est représentable, puis un sur quatre, et ainsi de suite. C'est pour cette raison qu'un compteur de secondes ou un identifiant stocké en simple précision devient faux à partir de 17 millions environ, sans le moindre message d'erreur.

f) Non. L'écart entre deux flottants consécutifs vaut 223×2k2^{-23} \times 2^{k} : il dépend de l'exposant, donc de l'ordre de grandeur du nombre. Près de 1, l'écart vaut environ 10710^{-7} ; près de 10610^{6}, il vaut environ 0,060{,}06. Les flottants sont serrés près de zéro et de plus en plus espacés en s'en éloignant, exactement comme les graduations d'une échelle logarithmique. Conséquence pratique : additionner un petit nombre à un grand peut ne rien changer du tout, ce qui rend une somme dépendante de l'ordre des termes.

1100000011001 0000 0000 0000 0000 000exposant, 8 bitsmantisse, 23 bitssigne : 1 = negatifexposant : 129hexadecimal : C0C80000
Chapitre précédent Logique booléenne et mathématique Chapitre suivant L'arithmétique modulaire

Ce chapitre resservira dans

Les chapitres qui le réclament en amont, plus tard dans l'année ou dans les années suivantes.

Voir aussi

Vous suivez le cours 201-N11 en informatique au cégep ?

Contactez-moi pour une première séance. Bachelier en informatique de McGill et maître en informatique appliquée de Concordia, je fais travailler la numération sur ce qui se casse en vrai : les débordements silencieux et les comparaisons de flottants.

Site par Studio Squalli