Académique Documents
Professionnel Documents
Culture Documents
Le développement de ce chapitre a été motivé par les interrogations soulevées par les
résultats suivants :
>>> np.add(np.uint8(233),np.uint8(124)))
?????????????????????????
?????????????????????????
1 / 13
MPSI A - ITC Représentation des nombres en mémoire
où les ai sont des symboles codant les entiers compris entre 0 et b − 1 .
Nous pouvons montrer la propriété dite de représentation des nombres entiers
en base b, qui justifie en partie l’intérêt l’usage de ces notations.
Soit b un entier supérieur ou égal à 2.
Pour tout entier naturel n , il existe p appartenant à N et a0 , . . . , ap des entiers
compris entre 0 et b− tels que :
p
X
n= ai .bi .
i=0
2 / 13
MPSI A - ITC Représentation des nombres en mémoire
Enfin, le choix de mettre le chiffre des unités tout à droite plutôt que tout à
gauche est également largement arbitraire : l’écriture décimale pourrait très bien
fonctionner - par convention - dans l’autre sens.
En informatique, on utilise fréquemment la base 2, dont nous allons beaucoup
parler ci-dessous.
Mais notons qu’il existe d’autres bases :
— La base 16 est également utilisée en informatique - par exemple pour repré-
senter des niveaux de canaux de couleur. Les chiffres en base 16 s’écrivent
usuellement 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F .
— La base 24 est utilisée pour les heures et la 60 est utilisée pour les secondes
et les minutes ? ! Mais plutôt que d’utiliser 24 et 60 symboles de chiffres (
qui seraient fastidieux à retenir ), on note ces chiffres en base 10. Cela oblige
d’ailleurs à utiliser des séparateurs ( h , : , ... ) et/ou à rajouter des 0 inutiles.
Par exemple si l’on notait simplement un horaire ( heure + minute ) 203, on
ne saurait pas si cela correspondrait à 20h03, 20h30 ou 2h03. . .
(b) Conversion d’un entier naturel de la base 10 à la base 2 .
Quelle est la représentation en base 2 de 0 ?
Nous est donné un entier naturel non nul n sous sa représentation décimale,
il existe donc de manière unique p appartenant à N et a0 , . . . , ap des entiers
appartenant à {0, 1} tels que :
p
X
ai .2i
n =
i=0
.
ap = 1
p
!
X
En écrivant : n = 2× ai .bi−1 +a0 , à quoi correspond a0 ? à quoi correspond
i=1
p
X
ai .bi−1 ?
i=1
Proposer une méthode pour déterminer a − 1 , puis a2 , .... et un critère d’arrêt.
Appliquer cette méthode pour déterminer la représentation binaire de 124 .
Écrire une fonction ( itérative et/ou récursive ) Python decimal_vers_binaire
(n:int) -> list qui prend en argument un entier n ( une assertion pourra
intervenir pour valider la positivité de l’entier ) et renvoie la liste [a0 , a1 , ..., ap ] ,
et proposer quelques jeux d’essai.
(c) Conversion d’un entier naturel de la base 2 à la base 10 .
Nous est donnée l’écriture binaire d’un entier naturel n = ap . . . a1 a0 2 .
i. Une approche naı̈ve.
2
Quelle est l’écriture décimale de 10110100010 ? Quel calcul trouvez-vous
pénible ?
3 / 13
MPSI A - ITC Représentation des nombres en mémoire
Écrire suivant le schéma utilisé ci-dessus, une fonction itérative Python bi-
naire_vers1_decimal (L:list) -> int qui prend en argument une liste
[a0 , a1 , ..., ap ] et renvoie l’entier n = ap . . . a1 a0 2 ,
et proposer quelques jeux d’essai.
Les calculs pénibles s’expliquant en évaluant la complexité de l’algorithme
itératif utilisé dans la fonction ci-dessus. À vous de jouer !
ii. Une approche améliorée.
2
Reprendre la conversion de 10110100010 en trouvant un moyen d’éviter ce
calcul pénible.
Écrire suivant le schéma utilisé ci-dessus, une fonction itérative Python bi-
naire_vers2_decimal (L:list) -> int qui prend en argument une liste
[a0 , a1 , ..., ap ] et renvoie l’entier n = ap . . . a1 a0 2 ,
et proposer quelques jeux d’essai.
Évaluer la complexité de l’algorithme utilisé dans la fonction ci-dessus.
Alors ?
iii. La meilleure méthode !
Nous avons : n = a0 + 2 × (a1 + 2 × (a2 + ... + 2 × (ap−1 + 2 × ap ))) !
2
Reprendre la conversion de 10110100010 en suivant cette écriture.
Écrire suivant le schéma utilisé ci-dessus, une fonction ( itérative et/ou
récursive ) Python binaire_vers3_decimal (L:list) -> int qui prend
en argument une liste [a0 , a1 , ..., ap ] et renvoie l’entier n = ap . . . a1 a0 2 ,
et proposer quelques jeux d’essai.
Évaluer la complexité de l’algorithme utilisé dans la fonction ci-dessus.
Alors ?
Cette méthode est connue sous le nom d’algorithme de Hörner, c’est la
méthode la plus efficace pour évaluer la valeur d’un polynôme en un point
( dans notre cas, nous avons fait une évaluation en 2, nous pouvons évaluer
en tout point ).
iv. Une approche récursive.
Écrire une fonction récursive Python binaire_vers4_decimal (L:list)
-> int qui prend en argument une liste [a0 , a1 , ..., ap ] et renvoie l’entier
n = ap . . . a1 a0 2 ,
et proposer quelques jeux d’essai.
Pourquoi le parenthésage de la méthode de Hörner peut-il se révéler natu-
rel ?
2. Représentation des données en mémoire.
(a) L’unité de mémoire en informatique.
L’unité de mémoire en informatique est le bit, contraction des mots anglais
binary digit qui signifient « chiffre binaire » .
4 / 13
MPSI A - ITC Représentation des nombres en mémoire
Un bit ne peut donc prendre que deux valeurs. Selon le contexte, numérique,
logique, électronique, magnétique ou optique, on les appelle « zéro » et « un » ,
ou « faux » et « vrai » , ou « ouvert » et « fermé » , ou « déchargé » et « chargé » ,
ou « nord » et « sud » , ou « noir » et « blanc » :
Contexte Valeurs
numérique 0 1
logique non/faux oui/vrai
interrupteur ouvert fermé
condensateur déchargé chargé
magnétique nord sud
optique noir blanc
Technologiquement parlant, il existe donc une grande variété de moyen d’enco-
dage binaire de l’information, selon le support de stockage ou de transmission
utilisé : les propriétés physiques telle que la polarisation magnétique, la charge,
le courant ou la tension électrique, l’intensité lumineuse, sont couramment uti-
lisées.
L’essentiel est d’autoriser avec une très bonne fiabilité la distinction entre les
deux états 0 et 1 de manière à limiter les erreurs.
(b) L’unité de stockage en informatique.
En informatique, toutes les données, quelles qu’elles soient, sont alors stockées
sous la forme abstraite d’une suite ininterrompue de zéros et de uns ( Matrix ! )
Par exemple, nous pouvons imaginer : 1101011101 et nous nous interrogeons
alors sur ce que représente cette série ... un mot ou plusieurs mots ? Il semble
alors nécessaire d’avoir un séparateur donc un nouveau symbole et nous n’avons
que deux symboles ... dilemme ! ! ! !
Nous choisissons alors une unité de stockage c’est-à-dire une longueur de regrou-
pement de bits.
Traditionnellement, l’unité de stockage est l’octet, constitué d’un groupement
de 8 bits.
Les premiers ordinateurs personnels (transportables) étaient « 8 bits » , c’est à
dire que processeur, bus et mémoires avaient pour unité de stockage l’octet.
Combien y a-t-il d’états différents possibles pour un octet ? ?
Les besoins grandissant en informatique ont amené une évolution de l’unité de
stockage en assemblant les unités de stockage, ce qui explique l’évolution par
doublement de la capacité :
— 8 bits ( fin des années 70, premiers ordinateurs personnels, performances
limitées )
— 16 bits ( milieu des années 80, les premiers PC, Apple Macintosh, Atari St,
jeux graphiques, ... )
— 32 bits ( années 90, internet, système d’exploitation avec interface graphique,
multimédia, ... )
5 / 13
MPSI A - ITC Représentation des nombres en mémoire
6 / 13
MPSI A - ITC Représentation des nombres en mémoire
— Sur 2 octets, soit 16 bits, nous pouvons représenter tous les entiers de :
2 2
0 = 0 à 1111111111111111 = 216 − 1 = 65535 ,
0 à 232 − 1 = 4294967295 .
0 à 264 − 1 = 18446744073709551615 .
>>> int(’1011’,2)
11
(b) Somme d’entiers naturels.
i. Opérations binaires sur les entiers.
Puisque les entiers sont constitués d’une suite de 0 et de 1 , nous pouvons
effectuer des opérations bit à bit comme des opérations logiques et, ou, ou
exclusif.
Opération Python
et bit à bit a&b
ou bit à bit a|b
ou exclusif bit à bit a∧b
décalage à droite de a sur b bits a >> b
décalage à gauche de a sur b bits a << b
où :
7 / 13
MPSI A - ITC Représentation des nombres en mémoire
8 / 13
MPSI A - ITC Représentation des nombres en mémoire
def binadd(a,b):
..............................
....................................
return(a)
9 / 13
MPSI A - ITC Représentation des nombres en mémoire
10 / 13
MPSI A - ITC Représentation des nombres en mémoire
Par exemple, sur 8 bits, nous représentons tous les entiers relatifs x compris
entre −128 et 127 par les entiers naturels n compris entre 0 et 255,
les entiers naturels n compris entre 0 et 127 correspondent aux entiers re-
latifs positifs x avec : x = n,
les entiers naturels n compris entre 128 et 255 correspondent aux entiers
relatifs négatifs x avec : n = x + 256 ou x = n − 256,
−1 est représenté par 255 , −2 par 254, ... , −127 par 129, −128 par 128.
Notons que l’opposé de −128 n’est pas représentable.
Un des premiers intérêts de cette représentation est l’unicité de la représen-
2
tation du zéro : 0 = 0000 0000 , nous avons aussi les algorithmes d’addition
et de multiplication vus dans le cas des entiers non signés, qui s’étendent
sans modification aux entiers signés.
Nous pouvons constater que le rôle du bit de poids fort est conservé :
x étant un entier relatif compris entre −2N−1 et 2N−1 − 1,
— dans le cas où x est positif, x est compris entre 0 et 2N−1 − 1, le bit de
poids fort est égal à 0,
— dans le cas où x est strictement négatif , nous utilisons l’écriture binaire
de n = 2N + x ⩾ 2N−1 , le bit de poids fort est donc égal à 1.
Quelle est la représentation en complément à 2 sur 8 bits de -87 ?
Ainsi en complément à 2 :
A. représenter en binaire sur N bits un entier relatif x donné en mode
décimal revient à discuter sur le signe de x,
— si l’entier relatif x est positif ou nul, nous le représentons comme
l’entier naturel n = x,
— si l’entier relatif x est strictement négatif, nous le représentons comme
l’entier naturel n = x + 2N ,
B. représenter en décimal un entier relatif x de représentation binaire sur
N bits notée m revient à discuter de la position de l’entier naturel n
d’écriture binaire m par rapport à 2N−1 − 1 , l’information est donnée
par le bit de poids le plus fort, à savoir :
11 / 13
MPSI A - ITC Représentation des nombres en mémoire
— si n < 2N−1 , x = n,
— et si n ⩾ 2N−1 , x = n − 2N .
Écrire une fonction Python naı̈ve qui rend en argument un entier relatif n et
renvoie sa représentation en complément à deux et proposer quelques jeux
d’essai.
Mettons en place un algorithme ( une méthode ) afin de construire la
représentation en complément à deux d’un entier relatif n appartenant à
J−2N−1 , −1K en évitant le calcul de 2N de très mauvaise complexité.
Nous déterminons dans un premier temps, la représentation binaire sur N
bits de r = −n, −n appartenant J0, 2N−1 − 1K, le bit de poids le plus fort
est donc égal à 0,
nous inversons ensuite tous les bits, 0 devient 1 et 1 devient 0 , nous obtenons
alors une nouvelle représentation r′ ,
et reste à additionner r′ et 1,
la nouvelle représentation r” obtenue est la représentation sur N bits en
complément à 2 de n.
Cherchons à expliquer cet algorithme de représentation en complément à 2
pour des valeurs négatives n.
Nous commençons donc par la représentation non signée de −n notée r ,
et nous construisons une nouvelle représentation r′ en échangeant 0 et 1,
nouvelle représentation r′ associée à un entier naturel n′ ,
et en additionnant ces deux représentations : r + r′ = |111....11
{z },
N bits
′ N
soit en valeur numérique : −n + n = 2 − 1,
c’est-à-dire : 2N + n = n′ + 1,
et par conséquent la représentation non signée de n′ + 1 = 2N + n est donc
la représentation en complément à 2 sur N bits de n.
N = 8
def representation_non_signee(n):
r = []
for k in range(0,N):
r.append(n % 2)
n = n // 2
return(r)
def representation_complementa2(n):
if (n >= 0):
r = representation_non_signee(n)
else:
12 / 13
MPSI A - ITC Représentation des nombres en mémoire
13 / 13