Cours - Les entiers⚓︎
Cours tiré très largement du manuel NSI 1re Spécialité - Ed. 2021 Hachette et de https://frederic-junier.gitlab.io/parc-nsi
1. Introduction⚓︎
La mémoire des ordinateurs est constituée d’une multitude de petits circuits électroniques (des transistors) et chacun ne peut être que dans deux états électriques : notés arbitrairement 0 et 1. La valeur 0 ou 1 d’un circuit mémoire élémentaire s’appelle un chiffre binaire, un booléen ou un bit (abréviation de binary digit). Depuis les années 1970, l’unité de mesure de l’espace (disque ou mémoire) est l’octet ou byte. Un octet correspond à 8 bits. Un octet peut donc prendre \(2^8 = 256\) valeurs différentes.
En pratique, le processeur d’un ordinateur échange avec la mémoire des informations (données ou adresse mémoire) comportant plusieurs octets de 4 à 8 en général. On parle de mots qui caractérisent l’architecture de la machine (32 bits ou 64 bits).
Tout type d’information (nombre, caractère, couleur . . . ) peut être stocké sous forme de séquence de bits. Une représentation interne ou codage est nécessaire pour définir une représentation binaire. Dans ce chapitre, nous aborderons les codages simples des nombres entiers positifs et des entiers relatifs.
2. Les entiers positifs⚓︎
2.1 En base 2⚓︎
2.1.1 Pour commencer⚓︎
Exemple
L'entier 1110 en base 2 est une séquence de 4 bits dont le poids dépend de leur position dans l'écriture.
Séquence de bits | 1 | 1 | 1 | 0 |
---|---|---|---|---|
Position | 3 | 2 | 1 | 0 |
Poids | \(2^3\) | \(2^2\) | \(2^1\) | \(2^0\) |
Le nombre 1110 en base 2 vaut donc en base 10: \(1110 = 1×2^3 +1×2^2 +1×2^1 +0×2^0 = 14\)
Pour éviter distinguer l'écriture en base 2 de celle en base 10 on écrira \(\overline{1110}^2 = 14\)
2.1.2 Les conversions⚓︎
compter en binaire vs compter en décimal
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 |
de binaire vers décimal
- \(\overline{1001}^2 = 2^3+2^0=9\) ou par l'algorithme de Horner (cf TP): \(\overline{1001}^2 = 1\times2\times2\times2+1=0\)
- \(\overline{100101}^2 = 2^5+2^2+2^0=37\) ou par l'algorithme de Horner: \(\overline{100101}^2 = (1\times2\times2\times2+1)\times2\times2+1=37\)
de décimal vers binaire
1ere technique: La conversion passe par la décomposition en puissance de 2: 1, 2, 4, 8, 16, 32, 64...
- \(9 = 8 + 1 = 2^3 + 2^0 = \overline{1001}^2\)
- \(37 = 32 + 5 = 32 + 4 + 1 = 2^5+2^2+2^0=\overline{100101}^2\)
- \(234 = 128 + 106 = 128 + 64 + 42 = 128 + 64 + 32 + 10\) \(= 128 +64 +32+8+2= 2^7 + 2^6+2^5+2^3+2^1=\overline{11101010}^2\)
2eme technique: utiliser les restes de la division par 2
- \(9=2\times4+1\); \(4=2\times2+0\); \(2=2\times 1+0\); \(1=2\times0+1\)
2.1.3 Les opérations⚓︎
Les sommes et les produits se font de la même manière que dans le système décimal. Mais attention seuls deux chiffres sont disponibles
Exemple d'addition
(1) (1) (1)
1 0 1 0 1 => 21
+ 1 1 1 => 7
____________________________
1 1 1 0 0 => 28
Exemple de multiplication
1 1 0 1 ==> 13
X 1 1 0 ==> 6
_________________________________
(1) 0
+ 1 1 0 1 .
+ 1 1 0 1 . .
_____________________________________
1 0 0 1 1 1 0 ==> 64+8+4+2=78
2.1.4 En python⚓︎
En Python, les entiers naturels et relatifs sont de type int et sont représentés de façon exacte, la seule limitation étant celle de la mémoire disponible.
>>> (type(734), type(-1))
(int, int)
>>> 0b101 # pour convertir l’écriture d’un entier naturel de la base 2 vers la base 10, on préfixe la séquence de bits de 0b
5
>>> bin(5) # Pour convertir l’écriture d’un entier naturel de la base 10 vers la base 2, on utilise la fonction bin
'0b101' # ATTENTION CA RENVOIE UNE CHAINE DE CARACTERES
2.2 En base 16⚓︎
On étend les dix chiffres de la base 10 avec A, B, C, D, E et F pour représenter 10, 11, 12, 13, 14 et 15.
A partir d'un exemple
L'entier 4F2A en base 16 est une séquence de 4 chiffres dont le poids dépend de leur position dans l'écriture.
Séquence de chiffres | 4 | F | 2 | A |
---|---|---|---|---|
Position | 3 | 2 | 1 | 0 |
Poids | \(16^3\) | \(16^2\) | \(16^1\) | \(16^0\) |
Le nombre 4F2A en base 16 vaut donc en base 10: \(4F2A = 4×16^3 +15×16^2 +2×16^1 +10×16^0 = 20266\)
Pour éviter distinguer l'écriture en base 16 de celle en base 10 on écrira \(\overline{4F2A}^{16} = 20266\)
En base 16, chaque octet est représenté par deux chiffres ce qui permet de condenser l’écriture. Par exemple, chaque carte réseau possède une adresse MAC codée sur 48 bits soit 6 octets et représentée par une séquence de 6 chiffres en base 16 séparés par le caractère : sous la forme : c8:60:00:a4:89:ab.
De même, les couleurs en représentation (R,G,B) sont codées sur 3 octets et dans le langage HTML des pages Web on les rencontre souvent notées comme séquence de six chiffres en base 16 préfixés par le caractère # : par exemple #FF0000 va coder un rouge pur.
Exemple de binaire à hexadécimal | Exemple de hexadécimal à binaire |
---|---|
Il suffit de grouper les bits par 4 et de convertir\(\overline{10011100}^2 = \overline{9C}^{16}\) | \(\overline{A3C}^{16} = \overline{101000111100}^2\) |
En python
>>> 0x9A # pour convertir l’écriture d’un entier naturel de la base 16 vers la base 10, on préfixe la séquence de bits de 0x
154
>>> hex(154) # Pour convertir l’écriture d’un entier naturel de la base 10 vers la base 16, on utilise la fonction hex
'0x9A' # ATTENTION CA RENVOIE UNE CHAINE DE CARACTERES
3. Entiers relatifs (entiers signés)⚓︎
3.1 Un bit pour le signe⚓︎
Une première idée consiste à réserver le premier bit (celui le plus à gauche, dit "bit de poids fort") au signe de l’entier (par exemple 0 pour positif et 1 pour négatif ) et les n −1 autres bits à la valeur absolue. Sur 8 bits, on peut ainsi représenter les entiers entre −127 et 127.
On a alors deux problèmes: deux représentation pour 0, et une addition qui ne fonctionne pas correctement
3.2 Par complément à 2⚓︎
Commençons par regarder le cas particulier des entiers codés sur un octet (8 bits). La représentation en complément à 2 consiste à représenter les entiers entre −128 et 127 (au lieu de 0 à 255) de la manière suivante :
- si \(x\) est entre 0 et 127 alors \(x\) est codé par son écriture binaire sur un octet.
- si x est entre -128 et -1 alors \(x\) est codé par l’écriture binaire de \(x +256\) sur un octet.
On fait donc correspondre à chaque entier de −128 à 127 un entier de 0 à 255 qui est ensuite codé sur 8 bits par sa représentation binaire. On remarquera que 0 admet alors une seule écriture : \(\overline{00000000}^2\). La représentation en complément à 2 sur 8 bits de −43 est alors \(\overline{11010101}^2\) et celle de 117 est \(\overline{01110101}^2\) .
On peut généraliser ce principe sur \(n\) bits. L'avantage de cette représentation est que l'addition fonctionne parfaitement.