Représentation des nombres signés et des réels
Les nombres négatifs
J'avais précisé dans l'introduction du chapitre précédent que les opérations de changement de base n'étaient valables que dans le cas ou le bit de poids fort était à zéro. En effet, lorsque ce bit est à 1, on est dans le cas de nombres signés. Là, vous devez vous dire, facile, je comptabilise la valeur des 7 premiers bits et le bit de poids fort m'indiquera le signe, positif si nul, négatif sinon. Hélas, ce n'est pas tout à fait aussi simple.
En effet, les opérations d'addition et de multiplication que nous allons voir par la suite ne fonctionneraient plus avec des nombres négatifs de cette manière. La méthode utilisée pour passer d'un nombre positif à son équivalent négatif est la méthode dite du "complément à 2".
Prenons par exemple la valeur 00011110 (30d). Nous voulons obtenir le nombre -30d. Cela se fait en deux étapes:
- On inverse tous les bits. Tous les 0 deviennent des 1, tous les 1 des 0. 00011110 -> 11100001.
- On ajoute 1. 11100001 -> 11100010 (cf chapitre sur les opérations arithmétiques)
Et voilà, vous avez votre -30d :). Ca peut paraitre stupide ce stratagème, mais ca fonctionne bien: pas besoin de définir de nouvelles opérations pour agir avec les nombres négatifs, toutes les opérations vues précédemment fonctionnent aussi bien avec des nombres positifs que négatifs.
Pour passer d'un nombre négatif à un nombre positif:
- On inverse tous les bits 11100010 -> 00011101
- Ajouter 1 00011101 -> 00011110
Chouette, c'est exactement pareil :)
J'en profite pour vous donner l'étendue des valeurs que peut prendre un nombre négatif. La plus grand entier négatif est 11111111b, soit l'opposé de 00000001b, soit -1. Le plus petit entier négatif est 10000000b, soit l'opposé de ... 10000000n. Bah oui... On inverse tous les bits, ca nous donne 01111111, on ajoute 1 -> 10000000. Les nombres négatifs sont donc compris entre -128 et -1, tandis que les nombres positifs vont de 0 à 127 (cf chapitre précédent). Un octet vous permet donc de coder tous les entiers appartenant à [-127, 128].
Représentation des réels
Pour représenter des réels, on utilise la technique dite des nombre à virgule flottante. Pour encoder 14.2145 par exemple, on va le noter 142145 * 10-2, et on va représenter séparément la valeur entière et la puissance. Pour cela on va utiliser un code sur 4 octets: les trois premiers octets serviront à représenter la valeur entière, le dernier servira à représenter l'exposant.
On dit que les réels codés sur 4 octets sont à simple précision, ceux codés sur 8 octets à double précision.