1 CHAPITRE 5 Les nombres entiers 2 Les entiers • Les données de types entiers correspondent à l’ensemble infini des nombres signés ℤ = … , −2, −1, 0, 1, 2, … • Impossible de représenter un ensemble infini dans un ordinateur comprenant un nombre fini d’espaces • Les entiers (int) représentent un sous-ensemble −𝑚, … , −1, 0, 1, … , 𝑛 • « m » est la valeur du plus petit entier négatif • « n » est la valeur du plus grand entier positif • Dépends du nombre de bits disponibles 3 Les entiers signés • Représentation possible sur 𝑙 bits • 1 bit pour le signe • 𝑙 − 1 bits pour la valeur absolue du nombre entier 𝑙=3 += 0; −= 1 2 représentations pour le 0 000 +0 001 +1 010 +2 011 +3 100 -0 101 -1 110 -2 111 -3 4 Les entiers signés • On doit prendre en compte la facilité avec laquelle les opérations mathématiques peuvent être implémentées. + 1 1 0 0 0 1 1 1 1 −2 + 1 = −3! 000 +0 001 +1 010 +2 011 +3 100 -0 101 -1 110 -2 111 -3 5 Les entiers signés • On peut régler le problème en examinant le bit de signe • Si les 2 opérandes sont de signe contraire • Soustraire à la plus grande valeur absolue la plus petite • Le signe du résultat est celui de la plus grande valeur (prise en absolue) 2 + −3 = −1 + 2 3 - 2 000 +0 001 +1 = 1 010 +2 = -1 011 +3 = 2 - 100 -0 = 1 101 -1 110 -2 111 -3 Ce n’est pas très pratique! 1 6 Complément à 2 • On peut représenter un nombre en utilisant l’arithmétique modulo 2𝑙 , où 𝑙 indique le nombre de bits employés. • 𝑥 = 𝑥 + 2𝑙 • −𝑥 = −𝑥 + 2𝑙 → −𝑥 = 2𝑙 − 𝑥 Nombre2 Valeur −𝑥 = 2𝑙 − 𝑥 Nombre2 Valeur 0000 +0 16 − 1 = 15 1111 -1 𝑙=4 0001 +1 16 − 2 = 14 1110 -2 𝑚 = 2𝑙−1 0010 +2 16 − 3 = 13 1101 -3 0011 +3 16 − 4 = 12 1100 -4 0100 +4 16 − 5 = 11 1011 -5 0101 +5 16 − 6 = 10 1010 -6 0110 +6 16 − 7 = 9 1001 -7 0111 +7 16 − 8 = 8 1000 -8 𝑛= 2𝑙−1 −1 7 Complément à 2 • Implication pour l’addition 5 + (−6) 0101 + 1010 1111 (-1) −5 + 6 1011 + 0110 1 0001 1 8 Complément à 2 • Inverse d’un nombre • Inverser chaque bit et ajouter 1 au résultat 5 −5 5 en binaire : 0101 Inverse les bits : 1010 Ajoute 1 : 1011 9 Complément à 2 • Toute valeur signée hexadécimale • Est positive si débute par [0-7] • Est négative si débute par [8-F] • La complémentarité à 2 fonctionne pour n’importe quelle base 10 Instructions arithmétiques • Toutes les instructions peuvent prendre comme 2e opérande • Un registre • Une valeur représentée sur 13 bits (−4096 ≤ 𝑥 ≤ 4095) • Lorsque l’instruction se termine par cc, le registre des codes conditions est mis à jour • Si le résultat est zéro, le bit Z est mis à 1 • Si le résultat est négatif, le bit N est mis à 1 • Nous reviendrons sur les bits V et C plus tard! 11 Instructions arithmétiques • Addition add rs1, {rs2 | imm13 }, rd addc rs1, {rs2 | imm13 }, rd addccc rs1, {rs2 | imm13 }, rd inc {imm13,} rs1 inccc {imm13,} rs1 • Soustraction sub rs1, {rs2 | imm13 }, rd subc rs1, {rs2 | imm13 }, rd subccc rs1, {rs2 | imm13 }, rd dec {imm13,} rs1 deccc {imm13,} rs1 12 Instructions arithmétiques • Multiplication mulx rs1, {rs2 | imm13 }, rd udivx rs1, {rs2 | imm13 }, rd sdivx rs1, {rs2 | imm13 }, rd neg rs1 neg rs1, rs2 • Division • Négation 13 Débordement de capacité (v) • Le résultat de l’opération ne tient pas sur 𝑙 bits • Il se produit un débordement dans une addition si les opérandes ont le même signe, mais que le résultat est de signe contraire 𝑙=4 + 0111 7 0110 6 1101 -3? • Il ne peut y avoir de débordement si les opérandes sont de signes contraires! 14 Débordement de capacité • Il se produit un débordement dans une soustraction si les opérandes ont des signes différents et que le résultat est de signe contraire au premier opérande • Une soustraction revient à faire une addition avec le complément à deux du second opérande 𝑙=4 - 0111 7 1101 -3 1101 -3 0111 7 1010 -6? 0110 6? • Il ne peut y avoir de débordement si les opérandes sont de mêmes signes! 15 Débordement de capacité • Il peut se produire plus souvent des débordements avec une multiplication (suite d’addition) • mulx ne positionne pas les codes de condition • Pour éviter les débordements, on suppose que les opérandes tiennent sur 𝑙/2 bits • −2𝑙 2−1 × −2𝑙 2−1 =2 𝑙 2−1 + 𝑙 2−1 = 2𝑙−2 < 2𝑙−1 − 1 • On doit quelques fois vérifier si les valeurs tiennent sur 𝑙/2 16 Débordement de capacité • Pour la division, il n’y a généralement pas de débordement si tous les opérandes et le résultat tiennent sur 𝑙 bits • Il y a une exception • La division signée (sdivx) du plus petit entier négatif par −1 • Le processeur n’indique pas de débordement • Le résultat est le plus petit entier négatif! 17 Report (c) • Le report n’a de sens que • Pour les additions et les soustractions sur 2𝑙 bits • Pour des instructions s’opérant sur 𝑙 bits • On calcule donc les résultats sur 𝑙 + 1 bits • Si le résultat du bit le plus significatif • Pour une addition, est à 1, il y a report • Pour une soustraction, est à 0, il y a report • Il n’y a jamais de report pour une multiplication ou une division 18 Report • Exemple avec un mot de 4 bits, addition de double-mot C 0000 11110 27 0001 1011 +45 +0010 +1101 72 0011 1000 Instructions SPARC • addcc • addccc • bvs 00111000 56! 01001000 72 0011 +1 0100 19 Report • Exemple avec un mot de 4 bits, soustraction de double-mot C 0000 10000 87 0101 0111 -41 -0010 -1001 46 0011 11110 Emprunt Instructions SPARC • subcc • subccc • bvs 00111110 62! 00101110 46 0011 -1 0010 20 Report • Exemple avec un mot de 4 bits, soustraction (par l’addition de l’inverse) C 1010 01110 87 0101 0111 +(-41) +1101 +0111 46 10010 01110 00101110 Le report est à 0! 46! 21 Report • Sur le SPARC, addccc ne fonctionne pas pour des opérandes de 64 bits • L’addition s’effectue en 4 étapes 1. Effectuer l’addition des mots les moins significatifs, avec C et V; 2. Effectuer l’addition du mot le plus significatif du 2e opérande et de C, avec C et V; 3. Effectuer l’addition du résultat et du mot le moins significatif, avec C et V; 4. Vérifier s’il y a eu débordement 22 Report 𝑉2 𝐶2 + 𝑉1 𝐶1 𝑜𝑝1,2 𝑜𝑝1,1 𝑜𝑝2,2 𝑜𝑝2,1 𝑜𝑝1,2 + 𝑜𝑝2,2 𝑜𝑝1,1 + 𝑜𝑝2,1 𝑉3 𝐶3 = 𝐶𝐹𝑖𝑛𝑎𝑙 = 𝐶2 ∨ 𝐶3 𝑉𝐹𝑖𝑛𝑎𝑙 = 𝑉2 ⊕ 𝑉3 23 Multiplication non signée • S’il n’existe pas d’instruction de multiplication, il faut la simuler • La façon intuitive, simple, inefficace • Faire la sommation du multiplicande un certain nombre de fois 3 × 5 = 3 + 3 + 3 + 3 + 3 = 15 • Avec un décalage vers la gauche • En binaire, multiplication par une puissance de 2! 24 Multiplication non signée • 000001102 × 000001002 = 000110002 = 6 × 4 = 24! • 13 × 11 = 13 × 23 + 21 + 20 • 1310 = 000011012 01101000 1101 × 1000 + 00011010 1101 × 0010 + 00001101 1101 × 0001 = 10001111 143 25 Multiplication non signée • Revient à faire la multiplication de façon usuelle • 13 × 11 = 143 1 1 0 1 × 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 + 1 1 0 1 = 1 0 0 0 1 1 1 1 26 Multiplication non signée • 13 × 11 = 143 • 13 est le multiplicande, 11 le multiplicateur • L’algorithme est donc • Initialiser le mot le plus significatif du produit à 0 • Initialiser le mot le moins significatif du produit avec le multiplicateur Produit : 0000 1011 27 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 1. Si le bit le moins significatif du mot le moins significatif du produit vaut 1, ajouter le multiplicande au mot le plus significatif du produit, sinon ajouter 0 • Conserver le bit C de cette addition Produit : 0000 1011 1101 Produit 2 : 1101 1011 C=0 28 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 2. Décaler le mot le plus significatif du produit d’une position vers la droite. • Conserver la valeur du bit perdu • La valeur du bit C précédent est insérée à gauche. Produit : 1101 1011 C=0 Produit 2 : 0110 1011 B=1 29 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 3. Décaler le mot le moins significatif du produit d’une position vers la droite. • Introduire à gauche le bit perdu de l’étape précédente. Produit : 0110 1011 Produit 2 : 0110 1101 B=1 30 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 1. Si le bit le moins significatif du mot le moins significatif du produit vaut 1, ajouter le multiplicande au mot le plus significatif du produit, sinon ajouter 0 • Conserver le bit C de cette addition Produit : 0110 1101 1101 Produit 2 : 0011 1101 C=1 31 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 2. Décaler le mot le plus significatif du produit d’une position vers la droite. • Conserver la valeur du bit perdu • La valeur du bit C précédent est insérée à gauche. Produit : 0011 1101 C=1 Produit 2 : 1001 1101 B=1 32 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 3. Décaler le mot le moins significatif du produit d’une position vers la droite. • Introduire à gauche le bit perdu de l’étape précédente. Produit : 1001 1101 Produit 2 : 1001 1110 B=1 33 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 1. Si le bit le moins significatif du mot le moins significatif du produit vaut 1, ajouter le multiplicande au mot le plus significatif du produit, sinon ajouter 0 • Conserver le bit C de cette addition Produit : 1001 1110 0000 Produit 2 : 1001 1110 C=0 34 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 2. Décaler le mot le plus significatif du produit d’une position vers la droite. • Conserver la valeur du bit perdu • La valeur du bit C précédent est insérée à gauche. Produit : 1001 1110 C=0 Produit 2 : 0100 1110 B=1 35 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 3. Décaler le mot le moins significatif du produit d’une position vers la droite. • Introduire à gauche le bit perdu de l’étape précédente. Produit : 0100 1110 Produit 2 : 0100 1111 B=1 36 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 1. Si le bit le moins significatif du mot le moins significatif du produit vaut 1, ajouter le multiplicande au mot le plus significatif du produit, sinon ajouter 0 • Conserver le bit C de cette addition Produit : 0100 1111 1101 Produit 2 : 0001 1111 C=1 37 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 2. Décaler le mot le plus significatif du produit d’une position vers la droite. • Conserver la valeur du bit perdu • La valeur du bit C précédent est insérée à gauche. Produit : 0001 1111 C=1 Produit 2 : 1000 1111 B=1 38 Multiplication non signée • L’algorithme est donc • Répéter n fois (n = nombre de bits, ici 4) 3. Décaler le mot le moins significatif du produit d’une position vers la droite. • Introduire à gauche le bit perdu de l’étape précédente. Produit : 1000 1111 Produit 2 : 1000 1111 On obtient 143! B=1 39 Multiplication signée • On peut faire la multiplication de deux entiers signés en utilisant l’algorithme précédent, modifié • On considère le multiplicateur comme un entier positif • Dans la dernière itération, l’addition de la 1re étape est remplacée par une soustraction • Pour être conforme avec la représentation complément à 2 • Le bit de report (c) est remplacé par l’expression 𝑛 ⊕ 𝑣 • Permet d’étendre le bit de signe dans le cas où le multiplicande est un entier négatif! 40 Division non signée • Similaire à l’algorithme de la multiplication • L’ordre des étapes est inversé • On décale à gauche au lieu de décaler à droite • Au lieu d’une addition, on fait une soustraction 41 Division non signée • L’algorithme final est • Initialiser le quotient avec le dividende • Initialiser le reste à 0 • Répéter n fois (n = nombre de bits) 1. Décaler d’une position vers la gauche la valeur du quotient. • Le bit perdu est conservé pour l’étape suivante 2. Décaler d’une position vers la gauche la valeur du reste • Le bit le moins significatif est remplacé par la valeur du bit perdu précédent 3. Soustraire le diviseur du reste 4. Si le résultat de la soustraction est négatif, mettre le bit le moins significatif du quotient à 0 et additionner le diviseur au reste, sinon mettre le bit le moins significatif du quotient à 1. 42 Division signée • On utilise l’algorithme précédent, en tenant compte du signe des opérandes et en effectuant les opérations avec les valeurs absolues des opérandes • Si les opérandes sont du même signe, le quotient est positif • Si les opérandes sont de signe contraire, le quotient est négatif • Le calcul du reste est sujet à controverse 𝑛÷𝑚= 𝑛 𝑚 17 ÷ 5 = 3 et − 17 ÷ 5 = −4 17 𝑚𝑜𝑑𝑢𝑙𝑜 5 = 2 et − 17 𝑚𝑜𝑑𝑢𝑙𝑜 5 = 3