Aller au contenu

Complément sur les flags

Pour mieux comprendre les flags (N, Z, C, V), nous pouvons les visualiser dans un graph.

Nombres non signés

La figure suivante représente le flag Z lors de l’addition de deux nombres non signés. Dans la figure l’origine \((0,0)\) est en bas à gauche.

Flag Z de l'addition X+Y pour les nombres non signés

Pour rappel, le flag Z est à 1 si le résultat de l’addition est zéro et on constate que \(0 + 0\) est bien égal à zéro (flag Z = 1). Les autres combinaisons de \(X\) et \(Y\) qui donnent zéro sont sur la diagonale et représentent les additions qui font un dépassement de capacité et qui reviennent à zéro. Par exemple, sur un système 8 bits, \(1 + 255 = 256\) ou \(2 + 254 = 256\). Le nombre \(256\) est trop grand pour être représenté sur 8 bits, le 9e bit est perdu et le résultat est \(0\).

La figure suivante représente les 4 flags lors de l’addition et la soustraction de deux nombres non signés.

Flags de l'addition et de la soustraction pour les nombres non signés

Pour le flag Z, on retrouve l’addition que nous venons de décrire. On voit aussi que la soustraction de deux nombres non signés donne zéro si les deux nombres sont égaux (\(0 - 0 = 0\) ou \(1 - 1 = 0\)).

La deuxième ligne représente le flag C. Sur la figure, on voit bien que ce flag est à 1 si on additionne deux nombres trop grands pour être représentés sur les bits à disposition. Sur un système 8 bits, on peut encore additionner \(127 + 127 = 254\) mais \(128 + 128 = 256\) et \(256\) est trop grand pour être représenté sur 8 bits.

Notez que pour l’addition, si le flag Z est à un, alors le flag C est aussi à un, sauf pour \(0 + 0\) où le flag Z est à un et le flag C est à zéro.

Pour la soustraction, le flag C est à un si l’opération ne fait pas de dépassement de capacité. On constate que C est à 1 si \(Y\) est plus petit ou égal à \(X\). En effet, is \(Y \leq X\), alors \(X - Y \geq 0\) et le résultat de la soustraction est correct.

Pour être complète, la figure représente aussi les flags N et V, mais ces flags n’ont pas beaucoup d’intérêt pour les nombres non signés.

Pour terminer avec les nombres non signés, voici toutes les combinaisons possibles pour les flags N, Z, C et V lors de l’addition et de la soustraction de deux nombres sur 8 bits non signés.

N Z C V Exemple d’addition soustraction
0 0 0 0 \(32+32\) \(32-224\)
0 0 0 1 impossible impossible
0 0 1 0 \(96+224\) \(224-160\)
0 0 1 1 \(160+160\) \(160-96\)
0 1 0 0 \(0+0\) impossible
0 1 0 1 impossible impossible
0 1 1 0 \(32+224\) \(64-64\)
0 1 1 1 \(128+128\) impossible
1 0 0 0 \(32+160\) \(160-224\)
1 0 0 1 \(96+96\) \(96-160\)
1 0 1 0 \(224+224\) \(224-32\)
1 0 1 1 impossible impossible
1 1 X X impossible impossible

Nombres signés

Pour les nombres signés, nous déplaçons le référentiel pour que \((0,0)\) soit au centre du graph. La figure suivante représente le flag Z lors de l’addition de deux nombres signés.

Flag Z de l'addition X+Y pour les nombres signés

Notez au passage que malgré le changement de référentiel, l’image est strictement identique à celle que nous avons pour l’addition de nombres non signés.

La figure suivante représente les 4 flags lors de l’addition et la soustraction de deux nombres signés.

Flags de l'addition et de la soustraction pour les nombres signés

L’explication pour le flag Z est la même que pour les nombres non signés.

Pour rappel, le flag N est à un quand le nombre est négatif. Pour l’addition, le résultat est négatif quand au moins un des deux nombres est négatif et que le résultat est lui aussi négatif. C’est le cas par exemple pour \(1 + (-2) = -1\), \((-2) + 1 = -1\) ou \((-1) + (-1) = -2\). Mathématiquement parlant, le résultat est négatif dans toute la zone en dessous de la diagonale, mais à cause du nombre de bits limité, on a un dépassement de capacité dans le coin en haut à droite et dans le coin en bas à gauche. Dans ces deux coins, on a un dépassement de capacité et le signe du résultat est faux. Ce dépassement de capacité est indiqué par le flag V qui est à un dans ces deux coins.

Pour la soustraction, le résultat est négatif si \(X\) est plus petit que \(Y\). Mathématiquement parlant, le résultat est négatif dans toute la zone en dessus de la diagonale, mais comme pour l’addition, on a un dépassement de capacité dans le coin en haut à gauche et en bas à droite. Le flag V est à un dans ces deux coins pour indiquer le dépassement de capacité.

La figure montre que le flag V est toujours à zéro lorsqu’on additionne deux nombres de signes opposés ou si on soustrait deux nombres de même signe.

Pour être complète, la figure représente aussi le flag C, mais ce flag n’a pas beaucoup d’intérêt pour les nombres signés.

Pour terminer avec les nombres signés, voici toutes les combinaisons possibles pour les flags N, Z, C et V lors de l’addition et de la soustraction de deux nombres sur 8 bits non signés.

N Z C V Exemple d’addition soustraction
0 0 0 0 \(32+32\) \(32-(-32)\)
0 0 0 1 impossible impossible
0 0 1 0 \(96+(-32)\) \((-32)-(-96)\)
0 0 1 1 \((-96)+(-96)\) \((-96)-96\)
0 1 0 0 \(0+0\) impossible
0 1 0 1 impossible impossible
0 1 1 0 \(32+(-32)\) \(64-64\)
0 1 1 1 \((-128)+(-128)\) impossible
1 0 0 0 \(32+(-96)\) \((-96)-(-32)\)
1 0 0 1 \(96+96\) \(96-(-96)\)
1 0 1 0 \((-32)+(-32)\) \((-32)-32\)
1 0 1 1 impossible impossible
1 1 X X impossible impossible