Moins trois degrés à Lille
Ce matin, la météo de ton téléphone affiche -3 °C à Lille. Ton appli de banque affiche 23,40 € sur ton compte.
À la leçon précédente, un octet allait de 0 à 255. Il n'y avait ni signe moins, ni virgule. Comment l'ordinateur garde-t-il un nombre sous zéro, ou un nombre avec des chiffres après la virgule ?
À la fin de cette leçon
Remarque
Je peux stocker un nombre négatif ou à virgule en binaire.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Complément à deux | la façon habituelle de stocker les entiers négatifs en bits |
| Bit de poids fort | le bit tout à gauche, celui qui pèse le plus |
| Dépassement | un résultat trop grand pour les bits qui le portent |
| Virgule fixe | un nombre dont la virgule reste toujours à la même place |
| Virgule flottante | un nombre gardé en chiffres et en puissance qui déplace la virgule |
| Erreur d'arrondi | un petit écart, car la valeur ne se garde pas exactement |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Avant de commencer
Remarque
Appuie sur Start the lab dans la barre en haut et attends que la machine soit prête. Chaque bouton Run tape sa commande dans le terminal, l'une après l'autre.
Le bit de gauche compte en négatif
En complément à deux, le bit de gauche d'un octet vaut -128 au lieu de 128. Les sept autres bits gardent leur poids habituel.
Un octet qui commence par 0 est donc positif ou nul. Un octet qui commence par 1 est négatif. Un octet va maintenant de -128 à 127. Cela fait toujours 256 nombres différents.
Exemple : un octet lu de deux façons
| Bits | Lu de 0 à 255 | Lu en complément à deux | Le calcul |
|---|---|---|---|
| 00000101 | 5 | 5 | 4 + 1 |
| 01111111 | 127 | 127 | 64 + 32 + 16 + 8 + 4 + 2 + 1 |
| 10000000 | 128 | -128 | -128 |
| 11101100 | 236 | -20 | -128 + 64 + 32 + 8 + 4 |
| 11111111 | 255 | -1 | -128 + 127 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Inverser les bits, puis ajouter un
Il existe une méthode rapide pour écrire un nombre négatif. Écris d'abord le nombre positif sur huit bits. Inverse chaque bit : 0 devient 1 et 1 devient 0. Ajoute ensuite un.
Les mêmes étapes ramènent un nombre négatif à son positif.
Exemple : écrire -20
| Étape | Bits |
|---|---|
| Écrire 20 | 00010100 |
| Inverser chaque bit | 11101011 |
| Ajouter un | 11101100 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Va dans le dossier arch
cd ~/archAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écris un programme C qui renvoie -20
printf 'int main(void) { return -20; }\n' > moins.cAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compile-le
gcc moins.c -o moinsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lance-le
./moinsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Demande au shell ce qu'il a renvoyé
echo $?Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent que les bits disent eux-mêmes si un nombre est négatif. C'est faux. Le programme a rendu -20 sous la forme 11101100. Le shell lit ces bits de 0 à 255, donc il affiche 236. Les mêmes bits veulent dire -20 ou 236 : tout dépend de qui les lit.
La virgule fixe ne bouge pas
Un logiciel de caisse ne garde pas 23,40 € avec une virgule. Il garde 2340 centimes. Tous les calculs se font alors en entiers, et les entiers sont exacts.
Le binaire peut faire la même chose. On choisit une place pour la virgule. Les places après elle valent un demi, un quart, un huitième, et ainsi de suite.
Exemple : 5,75 en virgule fixe
| Poids | 8 | 4 | 2 | 1 | , | 1/2 | 1/4 | 1/8 | 1/16 |
|---|---|---|---|---|---|---|---|---|---|
| Bit | 0 | 1 | 0 | 1 | , | 1 | 1 | 0 | 0 |
| Valeur | 0 | 4 | 0 | 1 | , | 1/2 | 1/4 | 0 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La virgule flottante se déplace
La virgule fixe ne peut pas tenir à la fois un très grand et un très petit nombre. La virgule flottante garde à part les chiffres et une puissance, comme 5,75 écrit 0,575 × 10.
La plupart des nombres à virgule, comme 0,1, n'ont pas d'écriture binaire exacte. L'ordinateur garde une valeur très proche, mais pas exacte.
Additionne 1,1 et 2,2
python3 -c "print(1.1 + 2.2)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le même calcul en centimes
python3 -c "print(110 + 220)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin : seize bits
Un jeu garde l'argent d'un joueur sur 16 bits en complément à deux. Quelle est la plus grande somme possible, et la plus petite ?
Garde la même idée que pour l'octet : le bit de gauche vaut moins ce qu'il vaudrait d'habitude. Que se passe-t-il pour un joueur au maximum qui gagne encore une pièce ?