Introduction à la programmation en assembleur (processeurs 64 bits de la famille 80x86)
2.2. Entiers signés et non-signés

Revenons sur les questions de capacité de représentation des données.

Si l'on considère les entiers naturels, la valeur la plus basse est bien entendu 0 et la valeur maximale est donnée par la formule 2n-1, n étant le nombre de bits utilisés pour le stockage. Autrement dit, un octet (8 bits) peut contenir des valeurs entières allant de 0 à 255, un mot (16 bits) des valeurs allant de 0 à 65.535, un mot long (32 bits) des valeurs allant de 0 à 4.294.967.295 et un mot quadruple (64 bits) des valeurs allant de 0 à 18.446.744.073.709.551.615.

Qu'en est-il pour les entiers relatifs ? Il est évident que d'une façon ou d'une autre, nous devrons utiliser 1 bit pour stocker le signe du nombre. Nous pourrions naturellement utiliser 1 bit pour stocker le signe et tous les autres bits pour stocker la valeur absolue. Mais il est aussi évident que cela nous obligerait à modifier l'algorithme que nous utilisons pour l'addition et la soustraction des entiers naturels.

Exemple

Par exemple, sur un octet, 0b1 – 0b11 devrait donner comme résultat : 0b10000001 alors que l'algorithme de soustraction pour les entiers naturels nous donne : 0b11111111.

Nous allons plutôt rechercher un type de représentation qui modifie le moins possible cet algorithme additif. La première constatation est que si l'on choisit le bit de poids fort comme bit de signe avec sa valeur 0 comme indication d'un nombre positif, hormis la question des capacités, l'addition et la soustraction fonctionneront comme avant.

Exemple

Par exemple, l'addition des deux entiers relatifs 64 et 63 (résultat 127), s'écrira en binaire :

En ce qui concerne les nombres négatifs, regardons ce qu'il se passe si l'on représente les nombre sur 3 bits : la valeur positive maximale est 3 (0b011), en soustrayant successivement 1 à cette valeur, nous obtenons :

Remarque

En théorie, pour l'opération 0b0-0b1, notre algorithme « naturel » de soustraction par propagation des retenues donne un nombre binaire composé d'une infinité de bits à 1. Mais seuls les 3 bits de poids faible du résultat peuvent être stockés.

Définition

Ce mode de représentation des nombres négatifs se nomme le complément à 2 . Pour obtenir l'opposé d'un nombre, il suffit d'inverser la valeur de chacun des bits de ce nombre et de lui ajouter 1.

Par exemple, l'opposé de 0b011 (3) sur 3 bits est 0b100+0b1 = 0b101 (-3).

Notez que si on ajoute naturellement un nombre à son opposé, on obtient bien la valeur 0 sur 3 bits.

Lorsqu'il s'agit d'entiers signés, les valeurs seront donc comprises entre -2n-1 et 2n-1-1, n étant le nombre de bits utilisés pour le stockage.

Notez que l'opposé de la valeur minimale (-2n-1) ne donne pas un résultat valide (2n-1>2n-1-1).

Exemple

Par exemple, l'opposé de 0b100 (-4) est 0b100.

Ici, on voit bien apparaître la différence entre les ensembles des entiers naturels (ℕ), des entiers relatifs (ℤ), des entiers non-signés sur x bits (ℕx) et des entiers signés sur x bits (ℤx). On a les relations suivantes :

ℕ⊂ℤ, ℤx⊂ℤ et ℕx⊂ℕ, mais il faut faire attention car ℕxℤx, par contre ℕx⊂ℤx+1.

Et bien entendu, toutes les opérations arithmétiques sont susceptibles d'amener nos valeurs à dépasser les bornes minimales ou maximales de nos entiers...