On attribue le système binaire à Leibniz vers 1700, mais cette version a été contestée par John W. Shirley dans "Binary Numeration before Leibniz".
il y a même une référence aux hexagrammes du Yi Jing (classique des changements) qui peuvent être représentés par un code binaire sur 6 bits (un bit est un chiffre qui vaut 0 ou 1).
En base 10, on utilise les chiffres de 0 à 9 associés à un multiplicateur exprimé par une puissance de 10. En base 2 on utilise les chiffres 0 et 1 associés à un multiplicateur exprimé par une puissance de 2. On pourrait généraliser ce principe à n'importe quelle base de représentation des nombres. Pour des bases supérieures à 10, on utilise des symboles en plus des chiffres de 0 à 9 que l'on appelle digits. En informatique, on utilise également la base 16 qui utilise les digits de 0 à 9 et A à F (majuscule ou minuscule).
On distingue les entiers non signés (ensemble ℕ) et les entiers signés (ensemble ℤ).
En appliquant ce qui vient d'être expliqué précédemment, on peut écrire la relation qui permet d'exprimer un nombre en base 10 à partir d'un nombre exprimé en base 2 sur n bits :
.
Cette relation permet de convertir un nombre exprimé en base 2 en un nombre exprimé en base 10.
La conversion décimale binaire est réalisée à l'aide d'une suite de divisions pas 2 jusqu'à ce que le quotient vaille 0.
1 | 7 | 3 | 2 | |||||||||||||||||||
1 | 3 | 8 | 6 | 2 | ||||||||||||||||||
1 | 0 | 6 | 4 | 3 | 2 | |||||||||||||||||
0 | 0 | 3 | 2 | 1 | 2 | |||||||||||||||||
1 | 0 | 1 | 1 | 0 | 2 | |||||||||||||||||
1 | 0 | 5 | 2 | |||||||||||||||||||
1 | 2 | 2 | ||||||||||||||||||||
0 | 1 | 2 | ||||||||||||||||||||
1 | 0 |
L'exemple ci-contre donne la conversion de 173 en base 2
Le résultat est 17310=101011012
A la place des divisions, je propose une méthode avec un tableau. On construit le tableau des puissances de 2 de 128, qui est la puissance de deux immédiatement inférieure à 173, jusqu'à 1
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
on déduit que 17310= 101011012
Pour représenter les nombres négatifs dans une base, on utilise le complément à la base en utilisant la relation où N est le nombre signé et n le nombre de bits maximium utilisé pour la représentation. Cela signifie qu'un nombre signé ne peut être identifié comme signé que sur un nombre de bits connus. Cela ne pose pas de problème pour les calculatrices et ordinateurs car le nombre de bits est fixé par la structure matérielle de la machine et peut être 8,16,32 ou encore 64 bits (8 et 16 étant maintenant obsolètes).
Dans le cas de la base 2 cette relation donne . Ce qui fait que c'est le bit de poids le plus fort (rang n-1), pour un nombre exprimé sur n bits, qui représente le signe du nombre, ce qui fait que le nombre en base 10, peut s'écrire en utilisant la relation : .
Une remarque importante :
la valeur négative -83 donne la même suite binaire que 173 sur 8 bits. On en déduit que la valeur binaire ne permet pas de savoir si le nombre est négatif ou positif.
Ceci explique que certains langage de programmation distinguent les entiers signés des entiers son signés et d'autres utilisent uniquement des entiers signés.
Au niveau du processeur c'est un registre particulier, nommé registre d'état qui contient les informations de signe après chaque calcul.
Sur les calculatrices les fonctions de conversions qui traitent les nombres négatifs utilise un certain nombre de bits (en général 16) qu'il faut respecter pour obtenir le bon résultat.
L'addition en binaire donne un résultat binaire identique pour les nombres signés et non signés. Cela vient de la représentation des entiers signés en complément à 2 et confirme que la représentation binaire ne permet de définir le type d'entier signé ou non signé.
1 | 1 | valeur non signée | valeur signée | |||||||||
0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | → | 73 | 73 | ||
+ | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | → | 173 | -83 | |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | → | 246 | -10 |
Le résultat ne peut pas être exprimé sur 9 bits, la retenue n'est pas affichée, car les microprocesseurs expriment le résultat sur le même nombre de bits que les opérandes :
1 | 1 | 1 | 1 | 1 | valeur non signée | valeur signée | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | → | 247 | -9 | ||
+ | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | → | 92 | 92 | |
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | → | 339 | 83 |
L'addition de deux nombres non signés de n bits donne normalement un nombre sur n bits. Le résultat est exprimé sur sur n bits, il y a donc des cas ou le résultat sera erroné.
L'addition de deux nombres signés de n bits peut également fournir des résultats erronés, comme la somme de deux nombres positifs qui donnent un nombre négatif ou bien la somme de deux nombres négatifs qui donnent un résultat positif, dans ce cas on parle de dépassement dans les calculs.
1 | 1 | 1 | 1 | valeur non signée | valeur signée | |||||||
0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | → | 106 | 106 | ||
+ | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | → | 61 | 61 | |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | → | 167 | -89 |
En base 10 faire une soustraction revient à ajouter l'opposé du nombre. En base 2, faire une soustraction revient également à ajouter la valeur négative du nombre qui est le complément à 2 du nombre.
Le calcul du complément à 2
Pour transformer un nombre positif en un nombre négatif en base 10, on ajoute le signe moins devant le nombre. En base 2 on calcule le complément à 2 qui consiste à prendre le complément à 1 du nombre puis ajouter 1. Le complément à 1 consiste à changer la valeur de chaque bit : un 0 devient un 1 et un 1 devient un 0.
L'exemple ci-dessous montre comment calculer le complément à 2 de la valeur 83 en base 10, et vérifie que le résultat donne bien -83.
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | = | 83 | |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | |||
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ||
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | = | -83 |
Un nombre en virgule fixe possède une partie entière et une partie fractionnaire (les chiffres après la virgule). Chaque partie est exprimée sur un nombre maximum de bits.
On procède de manière identique à la méthode des nombres non signés pour la partie entière, exprimée sur n bits, et, en ajoutant des puissances négatives de 2 pour la partie fractionnaire exprimée sur p bits :
.
La conversion de la forme binaire vers la forme décimale se fait également en appliquant la définition :
La conversion de la valeur décimale de la partie entière utilise les mêmes méthodes que pour les nombres non signés. Pour la partie fractionnaire, on utilise une suite de multiplications par 2 de la partie fractionnaire jusqu'à obtenir 0 pour la partie entière et pour la partie fractionnaire. La valeur binaire est composée de la suite des parties entières des résultats des multiplications.
La partie entière 4910 vaut 1100012
On utilise une suite de multiplications par 2 pour la partie fractionnaire : 0.23437510
0.234375 × 2 | = | 0.46875 |
0.46875 × 2 | = | 0.9375 |
0.9375 × 2 | = | 1.875 |
0.875 × 2 | = | 1.75 |
0.75 × 2 | = | 1.5 |
0.5 × 2 | = | 1 |
0 × 2 | = | 0 |
Une remarque importante : En base dix, où tous les nombres ne peuvent être exprimés avec un nombre fini de chiffres après la virgule. On a le même problème en base 2, ce qui provoque des calculs d'arrondis et quelques fois des erreurs de calculs.
Comme le montre le calcul, c'est le cas du la représentation binaire de 0.2 :
0.210=0.0011001100110011...2
0.2 × 2 | = | 0.4 |
0.4 × 2 | = | 0.8 |
0.8 × 2 | = | 1.6 |
0.6 × 2 | = | 1.2 |
0.2 × 2 | = | 0.4 |
0.4 × 2 | = | 0.8 |
0.8 × 2 | = | 1.6 |
0.6 × 2 | = | 1.2 |
0.2 × 2 | = | 0.4 |
Nombre de bits | valeur |
---|---|
8 | 0.19921875 |
12 | 0.199951171875 |
16 | 0.19999694824219 |
24 | 0.19999998807907 |
32 | 0.19999999995343 |
La représentation virgule flottante est identique à la notation scientifique en base 10 qui utilise un nombre, nommé mantisse, multiplié par une puissance de 10.
En base 2 on utilise une puissance de 2 ce qui donne ,
avec s bit de signe (0 ou 1), m mantisse de type réel compris entre 0 et 1, et e exposant décalé pour obtenir des valeurs d'exposants négatifs.
Un exposant décalé est de la forme e=E-D avec D décalage qui dépend du nombre de bits.
La norme IEEE 754 définit différentes précisions en fonction du nombre de bits affectés à la mantisse et à l'exposant. La valeur réelle est de la forme
.
Les différentes précisions sont rappellées dans le tableau ci-dessous :
simple | double | quadruple | |
---|---|---|---|
s (bits) | 1 | 1 | 1 |
m (bits) | 23 | 52 | 112 |
E (bits) | 8 | 11 | 15 |
D (valeur) | 127 | 1023 | 16383 |
valeur maxi | ±3.4×1038 | ±1.8×10308 | ±1.19×104932 |
valeur mini | ±2×10-126 | ±2×10-1022 | ±2×10-16382 |
précision relative | 2-23≈10-6 | 2-52≈10-15 | 2-112≈10-33 |
On peut calculer la représentation d'un nombre en virgule flottante en partant de la représentation en virgule fixe de ce nombre. Pour cela il suffit de décaler la valeur en virgule fixe pour obtenir la forme 1,m en ajoutant l'exposant qui correspond à ce décalage.
signe s | 0 |
mantisse m | 10001001111000000000000 |
exposant décalé E | 10000100 |
signe s | 0 |
mantisse m | 10011001100110011001100 |
exposant décalé E | 01111100 |