Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Stocker les nombres négatifs et à virgule

Après cette leçon: Je peux stocker un nombre négatif ou à virgule en binaire.

Leçon de 50 min7 commandesLab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

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

MotCe que ça veut dire
Complément à deuxla façon habituelle de stocker les entiers négatifs en bits
Bit de poids fortle bit tout à gauche, celui qui pèse le plus
Dépassementun résultat trop grand pour les bits qui le portent
Virgule fixeun nombre dont la virgule reste toujours à la même place
Virgule flottanteun nombre gardé en chiffres et en puissance qui déplace la virgule
Erreur d'arrondiun 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

BitsLu de 0 à 255Lu en complément à deuxLe calcul
00000101554 + 1
0111111112712764 + 32 + 16 + 8 + 4 + 2 + 1
10000000128-128-128
11101100236-20-128 + 64 + 32 + 8 + 4
11111111255-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

ÉtapeBits
Écrire 2000010100
Inverser chaque bit11101011
Ajouter un11101100

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Va dans le dossier arch

Commande
cd ~/arch

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.

Écris un programme C qui renvoie -20

Commande
printf 'int main(void) { return -20; }\n' > moins.c

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.

Compile-le

Commande
gcc moins.c -o moins

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.

Lance-le

Commande
./moins

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.

Demande au shell ce qu'il a renvoyé

Commande
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

Poids8421,1/21/41/81/16
Bit0101,1100
Valeur0401,1/21/400

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

Commande
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

Commande
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 ?

À propos de ce labo et de sa source: Lab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.