Altifigence Academy

8 / 37 · Concept

Complément à deux, extension de signe et dépassement

Distinguer interprétation signée et dépassement d'addition par des équations et contre-exemples.

Le poids du bit le plus significatif change

Un entier de NN bits en complément à deuxComplément à deux Représentation d'un entier signé par un motif de largeur fixe. Sur n bits, la plage va de −2^(n−1) à 2^(n−1)−1. s'interprète ainsi :

s=−bN−12N−1+∑i=0N−2bi2is=-b_{N-1}2^{N-1}+\sum_{i=0}^{N-2}b_i2^i
−2N−1≤s≤2N−1−1-2^{N-1}\le s\le 2^{N-1}-1

1010 sur quatre bits vaut 10 en non signéNon signé Interprétation d'un motif de bits comme entier non négatif. Sur n bits, la plage va de 0 à 2^n−1 et peut différer de l'interprétation signée du même motif. En savoir plus et -6 en signé. Il ne faut pas retirer le bit de signe et lire le reste comme une valeur absolue. À largeur fixe, −x-x s'obtient en inversantNégation L'opération NOT échange 0 et 1. Une barre au-dessus d'une expression applique NOT à toute l'expression qu'elle couvre. En savoir plus les bits puis en ajoutant 1 ; cependant, +8, opposé du minimum -8, n'existe pas dans la plage signée sur quatre bits.

Une extension doit préserver la valeur

L'extension non signée ajoute des zéros ; l'extension signée répète le bit de signe. Étendre 1010 en 00001010 donne +10, tandis que 11111010 donne -6. Selon l'interprétation, élargir le même motif demande un circuit différent.

SystemVerilog
logic signed [3:0] a, b;
logic signed [4:0] exact;
logic [3:0] result;
logic overflow;
assign exact = {a[3], a} + {b[3], b};
assign result = exact[3:0];
assign overflow = (a[3] == b[3]) && (result[3] != a[3]);

Cet exemple additionne deux opérandes signés sans retenue entrante. exact conserve la somme sur cinq bits, puis vérifie le signe du résultat réduit.

La valeur initiale 11111010 représente à la fois 250 non signé et −6 signé. En changeant b7, les deux valeurs évoluent en sens opposés.

Interpréter le signe des mêmes 8 bits

11111010 → unsigned 250 · signed -6 · hex 0xFA

Retenue et dépassement signé sont différents

V=aN−1⊕bN−1‾ (sN−1⊕aN−1)V=\overline{a_{N-1}\oplus b_{N-1}}\,(s_{N-1}\oplus a_{N-1})

Additionner deux valeurs de même signe et obtenir le signe opposé indique un dépassement. Sur quatre bits, 7+37+3 est stocké comme 1010, soit -6, et −8+(−1)-8+(-1) comme 0111, soit +7. Deux opérandes de signes différents ne produisent pas ce dépassement.

Mélanger signé et non signé en RTL rend les règles de comparaison et d'extension délicates. Explicitez largeur et caractère signé des opérandes ; testez minimum, -1, 0 et maximum.

Essayez vous-même

Sur quatre bits signés, donnez le motif stocké et le dépassement de −3+(−4)-3+(-4) puis 5+55+5. Expliquez aussi la négation de −8-8.

Lire l’explication

−7-7 vaut 1001, sans dépassement. 10 est hors plage et devient 1010 (-6), avec dépassement. Inverser -8 et ajouter 1 laisse 1000, car +8 n'est pas représentable ; ce n'est pas un calcul de valeur absolue valide.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.