Professional Documents
Culture Documents
Cela correspond en dcimal 45 . 13 = 585
Notons quen binaire, si lon multiplie a et b, il suffit de rcrire a chaque fois que lon tombe
sur un 1 dans b (en lisant de droite gauche), et de mettre 0 sinon, tout en pratiquant un dcalage
dun cran vers la gauche chaque tage. La seule diffrence avec la multiplication dans le systme
dcimal est que lon simpose de faire des additions de deux en deux, pour viter des retenues trop
grandes.
1-3) Conversions dans dautres bases
Ce que nous avons fait en base 2, par analogie avec le systme dcimal (base 10) peut se
gnraliser nimporte quelle base b. Cest encore plus simple pour des bases qui sont des
puissances de 2, notamment le systme octal (base 8) et le systme hexadcimal (base 16). Dans ce
cas on passe dabord en binaire, puis :
*
Si lon veut une criture en octal, on pratique un regroupement par blocs de longueur 3 partir
de la droite.
Par exemple : 26 (dcimal) 11010 (binaire) ou 011 010 32 en octal (soit 3 . 8 + 2)
*
Si lon veut une criture en hexadcimal dont les chiffres sont par convention 0 1 2 3 4 5 6 7 8
9 A B C D E F, on regroupe les termes par blocs de longueur 4 partir de la droite.
Par exemple : 26 (dcimal) 11010 (binaire) ou 0001 1010 1A en hexadcimal (soit 1 . 16
+ 10)
1-4) Arithmtique en prcision finie
Lorsquil travaille sur des nombres entiers, lordinateur ne fait aucune erreur ( Il est
monstrueusement inhumain car il ne fait pas derreurs disait une pub). En fait cela nexact que si
lon ne dpasse pas les limites finies de la place mmoire dans lesquelles sont bloqus les nombres
entiers. La somme de deux nombres entiers qui rentrent dans ces limites peut, elle, dpasser la
limite, ce qui aboutit un rsultat faux. De mme la proprit dassociativit peut tre mise en
dfaut. Avec a et b c qui restent dans les limites, ainsi que a + (b c), il peut arriver que a + b
soit hors limites, donnant un rsultat faux, et lon naura plus a + (b c) = (a + b) c.
Heureusement, dans les rcents langages C, les entiers sont assimils aux entiers longs, et lon peut
aller jusqu des nombres dpassant le milliard sans aucun risque.
8
2) Les nombres entiers relatifs, positifs ou ngatifs, en base 2
On dit quil sagit de nombres signs (ils ont le signe + ou le signe ). Voici comment lon
procde en binaire, sans utiliser les symboles + ou , mais en remplaant ce signe par un chiffre 0
ou 1. Tous les nombres en binaire de longueur L, correspondant aux nombres de 0 2
L
1 en
dcimal, au nombre de 2
L
, vont maintenant reprsenter les nombres de 2
L 1
+ 2
L 1
1. Par
exemple pour L = 3 :
0 000 devient +0
1 001 +1
2 010 +2
3 011 +3
4 100 - 4
5 101 - 3
6 110 - 2
7 111 - 1
Une telle correspondance est facile comprendre : quand le bit le plus gauche est 0, on
retrouve les entiers positifs (ou nuls). Lorsque le bit le plus gauche est 1, il sagit dun nombre
ngatif, et pour savoir qui est ce nombre, il suffit de lcrire avec ses puissances de 2 en addition,
sauf celle la plus gauche mise en soustraction. Par exemple 110 devient 2
2
+ 2
1
= 4 + 2 = 2.
Autre exemple : 1101001 donne 2
6
+ 2
5
+ 2
3
+ 2
0
= 64 + 32 + 8 + 1 = 64 + 41 = 23.
Comment passer dun nombre son oppos ? On commence par prendre le complment du
nombre bit bit (en remplaant les 0 par des 1 et vice versa) et en ajoutant 1. On dit que lon prend
le complment deux, mais quimporte !
2
Lavantage de cette criture de loppos, cest que
grce lui on peut faire des additions comme dhabitude, suivant la rgle que lon connat dj
pour les nombres habituels : soustraire, cest ajouter loppos.
3
Autrement dit, ladditionneur qui
se trouve lintrieur de lordinateur sera aussi capable de faire des soustractions.
Exemples dopposs :
1101101 (correspondant 64 + 45 = 19) est dabord complment, soit 0010010 puis on lui
ajoute 1, ce qui donne 0010011, qui est justement 16 + 2 + 1 = 19, loppos de 19.
2
En fait il sagit du complment 2
n
, n tant la longueur du nombre. Plus prcisment, si x est le nombre,
son oppos est 2
n
- |x|.
3
Lorsque lon travaille avec des nombres entiers en base 10, on sait bien que la soustraction est en fait
une addition, puisque soustraire cest additionner loppos, par exemple 10 7 = 10 + ( 7). Mais cela
nempche pas que lon doive savoir pratiquer des soustractions, et quelles sont diffrentes des additions.
Voici comment on traite une soustraction, en en faisant terme terme avec des retenues ventuelles :
2389
- 1792
597
Pour viter dimposer lordinateur de savoir faire des soustractions par une mthode autre que celle des
additions, on fabrique loppos par complment 2 , puis on fait une addition classique, et cela marche.
9
011011 (nombre positif 27 cause de son 0 gauche) devient par complment 100100 puis en
ajoutant 1 : 100101, soit 32 + 5 = 27.
Remarque : pour un nombre non sign on pouvait ajouter sa gauche autant de 0 que lon veut :
1101 = 001101. Pour les nombres signs, cela nest pas possible de la mme faon, puisque le bit le
plus gauche est le signe, par exemple 1101 est 8 + 4 + 1 = 3, tandis que 001101 est + 8 + 4 +1
= + 13. Mais on peut quand mme crire un nombre positif ou ngatif avec la longueur que lon
dsire. Le nombre +3 scrit 011 avec son zro gauche pour indiquer le +, mais il peut aussi
scrire 0011 ou 00011, . tandis que le nombre -3 scrit 101 (= -4 + 1) ou aussi 1101, 11101,
111101, etc.
Exercice : crire 5 sur 16 bits.
5 peut scrire au minimum sur quatre bits (il est entre 8 et 7), soit 1101. Pour lavoir sur 16
bits, il suffit de rajouter des 1 devant, et lon obtient 1111111111111011, qui est aussi, comme on
peut le vrifier : - 2
15
+ 32763 = - 32768 + 32763 = -5.
On est maintenant en mesure de faire des additions avec des nombres ventuellement ngatifs,
cest--dire aussi des soustractions. Il convient que les deux nombres aient la mme longueur, pour
que les bits de signe puissent tre lun au-dessous de lautre. Normalement cela se fait sur une
longueur de 32 ou 64 bits, mais ici nous allons prendre des nombres plus courts. Faisons par
exemple des additions avec des nombres signs sur quatre bits : ils sont compris entre 8 et +7. Le
rsultat devra aussi tre bloqu sur quatre bits. Si le rsultat sort de la zone entre 8 et +7, il sera
faux et lon dit alors quil y a dpassement de capacit (overflow). Pour tester cet overflow, sachant
que la machine nest pas capable de savoir si le rsultat est bien compris entre 8 et +7, il
conviendra de trouver un autre moyen de le savoir, comprhensible par ladditionneur.
Il pourra aussi arriver que le calcul provoque une retenue gale 1 sur un cinquime bit. Il
faudra lenlever, comme si elle nexistait pas, puisque lon ne peut pas sortir des quatre bits. Mais
alors deux choses sont possibles. Soit la suppression de ce bit de trop ventuel laisse le rsultat
exact, et cest ce qui va arriver si le rsultat reste dans la zone comprise entre 8 et +7. Soit la
suppression de ce bit provoque une erreur de calcul, et cela aura lieu parce que le rsultat sort de
la zone entre 8 et + 7 (overflow). Vrifions tout cela sur des exemples.
*
cas de deux nombres positifs
0011 3
0100 +4
0111 7 cest juste
0011 3
0110 +6
1001 cest faux, au lieu de +9 on trouve 7. On est dans un cas de dpassement de capacit.
Remarquons que la retenue au rang 3 (en allant de droite gauche) est 1 et quelle est 0 au rang 4.
*
cas de deux nombres ngatifs
1101 3
1100 4
11001 7 Cest juste condition de supprimer le bit 1 de trop, en position 4
10
1101 3
1001 7
1 0110 Cest faux puisque lon ne doit conserver que 4 bits dans le rsultat, et que lon
trouve 6 au lieu de 10 (si lon conservait le 5 bit, ce serait juste, mais on ne doit pas le garder !).
Il y a dans ce cas dpassement de capacit. Remarquons que cela sest produit lorsque la retenue au
rang 3 est 0 et celle au rang 4 est 1
*
cas avec un nombre positif et un nombre ngatif. Avec ces deux nombres dans la zone
permise, le rsultat sera aussi dans cette zone. Il ny a jamais de dpassement de capacit dans ce
cas.
1101 3
0001 +1
1110 2 Cest juste
1101 3
0101 +5
10010 +2 Cest juste condition de supprimer le bit 1 de trop, en position 4.
Finalement, laddition de deux nombres signs de longueur n est juste, en supprimant le bit 1
ventuel qui arrive en position n (en dehors de la zone de longueur n), condition quil ny ait pas
de dpassement de capacit. Comment reconnatre sil y a dpassement de capacit ? Daprs ce
qui prcde, cela arrive dans deux cas exactement : les retenues en position n 1 et n sont 0 1 ou
1 0. Le test doverflow se fait sur ces deux possibilits.
Exercices de calcul sur des nombres signs (ici de longueur 6), en comparant le rsultat
avec celui du calcul en base 10
110011
011001
001100 en supprimant le bit 1 de trop gauche. Cest laddition dun nombre positif et dun
nombre ngatif. Elle est forcment juste, cela correspond 13 + 25 = 12.
100101
010110
111011 Cest forcment juste, correspondant 27 + 22 = 5
100110
101011
010001 On a supprim le bit 1 de trop gauche. Le rsultat est faux : avec 26 21 on trouve
ici + 17 au lieu de 47. Ctait prvisible car on est dans un cas de dpassement de capacit, avec
les retenues en position 6 et 5 qui sont 1 0.
Par contre si lon avait travaill avec des nombres de longueur 7, le rsultat aurait t juste :
1100110 + 1101011 = 1010001 (on a supprim le bit de trop), cela correspond bien : 26 21 =
47. Il ny a pas dpassement de capacit dans ce cas, les deux retenues de rang 7 et 6 sont 1 1.
001110
11
011001
100111 Ce rsultat est faux, car les retenues en position 6 et 5 sont 0 1, ce qui signifie
dpassement de capacit (14 + 25 = 39, et dans le cas prsent nous avons trouv 25). Mais si lon
travaillait sur 7 bits, ce serait juste : 0001110 + 0011001 = 0100111. Il ny a pas dpassement de
capacit dans ce cas puisque les retenues aux rangs 7 et 6 sont 0 0.
3) La reprsentation des nombres virgule
Nous allons maintenant travailler avec des nombres virgule (que les anglo-saxons notent avec
un point). Dans le systme dcimal, crire un nombre comme 13,48 cela signifie :
1 . 10
1
+ 3 . 10
0
+ 4 . 10
-1
+ 8 . 10
-2
, la seule nouveaut tant la prsence de puissances ngatives
de 10 pour les nombres situs derrire la virgule. Il en est de mme en binaire avec des puissances
de 2. Par exemple 110,101 signifie 1 . 2
2
+ 1 . 2
1
+ 0 . 2
0
+ 1 . 2
-1
+ 0 . 2
-2
+ 1 . 2
-3
. Il nous reste
apprendre la conversion base 10 base 2.
*
Passage de la base 2 la base 10, par exemple pour le nombre 110,101. Sa partie entire 110
donne 4 + 2 = 6, sa partie derrire la virgule est 1/2 + 1/8 = 0,5 + 0,125 = 0,625. Le nombre en base
10 scrit 6,625.
*
Passage de la basse 10 la base 2 :
Prenons lexemple de 0,35. On veut lcrire sous la forme 0,35 = a 1/2 + b 1/4 + c 1/8 + avec
a, b, c, , gaux 0 ou 1. Pour avoir a, on fait 0,35 . 2 = 0,7 = a + b 1/2 + c 1/4 + qui est de la
forme a + 0, , ce qui donne a = 0. On en est 0,7 = b 1/2 + c 1/4 + , faisons comme
prcdemment 0,7 . 2 = 1,4 = b + c 1/2 + , do b = 1, et il reste 0,4 = c 1/2 + On remultiplie
par 2 pour avoir c, et ainsi de suite.
Cela revient faire la suite x
n+1
= 2 x
n
ramene modulo 1, avec x
0
= 0,35, en dgageant chaque
fois la partie entire. On obtient ainsi la succession :
0,35 . 2 = 0,7 0
0,7 . 2 = 1,4 1
0,4 . 2 = 0, 8 0
0,8 . 2 = 1,6 1
0,6 . 2 = 1,2 1
0,2 . 2 = 0,4 0
0,4 . 2 = 0,8 0
do 0,35 = 0, 0101100
On remarque que la succession des chiffres derrire la virgule est finalement priodique avec
derrire 01 le bloc 0110 qui se rpte indfiniment. Cela entrane quavec un nombre toujours
limit de bits, on naura jamais exactement 0,35 en binaire.
A son tour un nombre comme 17,35 (= 17 + 0,35) scrira 10001,0101100 Cela sappelle une
criture en virgule fixe, par opposition lcriture des nombres en virgule flottante (float) utiliss
par lordinateur. Virgule flottante signifie que lon peut dplacer la virgule selon notre gr, comme
par exemple dans le systme dcimal : 17,35 = 1735 . 10
2
= 1,735 . 10
1
, etc. condition de faire
intervenir des puissances de 10 en multiplication. Cest particulirement intressant pour les trs
grands nombres ou ceux trs proches de 0, pour lesquels on choisit lcriture scientifique, o lon a
des nombres de quelques units multiplis par des puissances de 10, comme par exemple
1,72 . 10
15
ou 2,34 . 10
-12
. Parmi toutes les critures possibles, on prfre celle o la partie entire
12
du nombre ( gauche de la virgule) est un chiffre, celui-ci tant compris entre 1 et 9. On fait de
mme en binaire.
Un nombre flottant en binaire est cod sur 32 bits, en simple prcision, ou sur 64 bits en double
prcision. Il est fabriqu partir de trois variables : s pour son signe, e pour son exposant et f pour
la partie derrire la virgule. Voici la valeur du nombre lorsquon lcrit sur 32 bits :
( 1)
s
. 2
e 127
. (1 + f
1
. 2
1
+ f
2
. 2
2
+ f
3
. 2
3
+ + f
23
. 2
23
)
avec s, e et f qui occupent chacun une partie des 32 bits.
*
s occupe un bit, valant 0 ou 1. Il va donner le signe positif ou ngatif du nombre, puisquil
intervient par ( 1)
s
, ce qui donne +1 ou 1.
*
e occupe 8 bits, soit 256 valeurs (de 0 255). Il intervient par 2
e 127
, allant de 2
127
2
128
.
*
la partie derrire la virgule f est un mot de 23 bits, de la forme binaire f
1
f
2
f
3
f
23
. A partir de
l on fabrique le nombre : 1 + f
1
. 2
1
+ f
2
. 2
2
+ f
3
. 2
3
+ + f
23
. 2
23
. Ce nombre de partie
entire 1 est de la forme 1, f et il est toujours situ dans lintervalle [1 2[.
Exemple : le mot de 32 bits est 1 10000010 0011000.0 avec s = 1, e = 128 + 2 = 130, soit e
127 = 3, et f = 2
3
+ 2
4
= 0,125 + 0,0625 = 0,1875, do le nombre :
2
3
. 1,1875 = 8 . 1,1875 = 9,5.
Quel est lintrt de cette criture en virgule flottante ? Rappelons que pour les nombres entiers
crits avec n bits nous obtenions 2
n
nombres stalant sur un intervalle de longueur 2
n
. Cet
intervalle est bien trop restreint pour les nombres virgule, o grce lcriture en float on arrive
une gamme de nombres stalant entre 2
-127
et 2
128
au signe prs.
En effet,
*
Si e = 0, e 127 = 127. En mettant des 0 derrire la virgule, on obtient le nombre ( 1)
s
2
127
que lon assimile 0.
*
Si e = 255 , e 127 = 128, et avec des 0 derrire la virgule le nombre est (1)
s
2
128
, proche de
ou +.
Comme on la vu, le caractre fini de lcriture des nombres peut conduire des pertes minimes
pour les nombres dcimaux, et plus largement pour les nombres rels quelconques qui ont une
infinit de termes derrire la virgule et dont on ne peut avoir quune approximation. Au-del de sa
dfinition initiale, pas trs claire, voquant le dplacement de la virgule, le mot float prend un sens
bien plus vocateur : les nombres qui flottent sont des nombres qui peuvent ne pas tre parfaitement
exacts.
Exercice : convertir 3,14 en flottant 32 bits.
En virgule fixe, 3,14 devient 11,0010001111, ou encore 2
1
. 1,10010001111
Sa reprsentation en flottant est 1 10000000 10010001111.