web-dev-qa-db-fra.com

Pourquoi l'indicateur de portage est-il défini lors d'une soustraction alors que zéro est la minuend?

En ce moment, j'écris ma propre petite bibliothèque pour les opérations arithmétiques et logiques sur de très grands entiers non signés. Pour améliorer les performances, j'ai décidé d'implémenter certaines fonctions dans Assembly. Voici donc ma question. Lors de la soustraction de deux entiers non signés, l'indicateur de portage est défini lorsque je soustrais un nombre quelconque de 0.

Mais pourquoi le Carry Flag est-il réglé dans cette situation? L'indicateur de portage n'est défini que lorsqu'un débordement se produit, mais si je soustrais un nombre à zéro, je n'obtiens pas de débordement. Ou je me trompe?

8
idlmn89

Le drapeau de transport est un transport ou un emprunt du bit le plus significatif (MSb):

CF (bit 0) Drapeau de portage - Défini si une opération arithmétique génère un report ou un emprunt du bit le plus significatif du résultat; dégagé autrement. Cet indicateur indique une condition de dépassement de capacité pour l'arithmétique de Unsigned-integer. Il est également utilisé dans l'arithmétique multi-précision.

N'associez pas le CF au bit de signe, dans une soustraction, CF est défini chaque fois que la minuend, traitée comme non signée, est inférieure à la valeur sub-end, traitée comme non signée.
Ceci est équivalent à une condition de dépassement de capacité, pour les numéros signés, l'indicateur équivalent est OF. 

Pour un indice visuel (inutile?), Dans cette opération 4-5, c’est le deuxième emprunt, le rouge, qui définit le CF

 Borrow and CF

Pas si vous soustrayez à zéro, il vient naturellement que pour n'importe quel nombre, mais zéro lui-même, vous aurez toujours le jeu CF, car la soustraction a au moins un bit défini.


Enfin, certaines instructions vous permettent de changer le bit de signe sans affecter le CF (voir, par exemple, les opérations logiques ou le comportement de neg).

10
Margaret Bloom

Nous savons dès l’école primaire que a - b = a + (-b). Et c’est ainsi que la logique ne nous soustrait pas, nous ajoutons le négatif. Nous savons également, grâce aux cours de programmation pour débutants, qu’avec deux deux, le négatif est inversé et ajouté. a - b = a + (~ b) + 1. Nous connaissons aussi depuis l’école le concept de porter. 9 + 3 = 2 portent celui-ci. Identique en binaire, avec deux opérandes vous pouvez avoir 1 + 1 = 0 pour porter celui-ci. Donc, chaque colonne en logique nécessite un report. Il y a trois bits dans deux bits en sortie, les deux opérandes en plus portent et effectuent le résultat. Puisque chacun de ces blobs logiques a un bit d’entrée, carry in, l’addition normale qui suit en premier est un zéro, mais pour la soustraction, nous pouvons le porter en 1 et inverser le second opérande pour obtenir a + b = a + (~ b) + 1

Donc, la soustraction est additionnelle, si vous travaillez à travers quelques exemples simples, ou si vous essayez mieux toutes les combinaisons d'opérandes à trois bits vous-même. Vous verrez qu’il n’existe pas d’addition (ou de soustraction) signée ni non signée, la beauté de l’encodage en complément à deux.

Sachant tout cela, la soustraction est additionnelle; avec addition, nous obtenons une exécution sur un dépassement de capacité UNSIGNED, le bit de dépassement signé correspond au report entrant et à la réalisation du msbit ne correspondant pas, généralement représenté par le drapeau V. Maintenant, certaines architectures, puisqu'elles inversent déjà l'opérande b lors de l'entrée et le report dans l'entrée, elles inversent l'exécution à la sortie. QUELQUES NE PAS. Vous devez donc examiner votre architecture particulière pour savoir si l'exécution est considérée comme un dépassement d'addition non signé ou s'il s'agit d'un emprunt. ou ne pas emprunter ou autre chose.

zéro moins quelque chose ne va pas toujours avoir une exécution pour l'addition. 

0b000 - 0b111

 0001
  000
+ 000
=====
  001

La réalisation de l'addition est zéro. Votre architecture peut choisir de le laisser ainsi ou d'inverser et l'appeler un emprunt.

Au sein d'une famille d'architecture. Tous les x86 ou tous les bras, il est probable qu'ils continueront à le faire de la même manière pour toujours. Mais il n’ya aucune raison de s’attendre à ce que ARM, MIPS, x86 et XYZ le fassent de la même manière.

L'inverser et le définir comme un emprunt a du sens d'un point de vue terminologique. 

Notez que toutes les définitions (signé/non signé) supérieures à, inférieures, supérieures ou égales, inférieures ou égales sont basées sur le choix de portage/emprunt pour cette architecture, vous ne pouvez pas traduire ces comparaisons d'indicateur entre architectures à moins qu'elles ne même définition.

2
old_timer