Pourquoi est le porte Drapeau lors d'une soustraction lorsque le zéro est le minuend?
Au moment où j'écris ma propre petite bibliothèque pour les opérations arithmétiques et logiques pour les très grands entiers non signés. Pour améliorer les performances, j'ai décidé de mettre en œuvre certaines fonctions dans l'assemblée. Voici donc ma question.
Tandis que la soustraction de deux entiers non signés sur le porte Drapeau est réglé quand j'ai soustraire n'importe quel nombre de 0.
Mais pourquoi le Drapeau de portage mis dans cette situation? Le porte Drapeau est seulement lorsqu'un dépassement de capacité se produit, mais si j'ai soustraire un nombre à partir de zéro, je ne suis pas un dépassement de capacité.
Ou je me trompe?
- Remarque: l'écriture de vos propres opérations en assemblée peut pas fournir à l'optimisation de vous anticiper. Le compilateur ne vérifie pas la ligne de l'assemblée et n'a aucun moyen de les optimiser. Vous pouvez trouver le compilateur va faire un meilleur travail d'optimisation si vous fournissez simplement logique du code C.
- Merci pour vos conseils. Mais je ne fais pas assembleur en ligne. J'écris des pièces détachées en assemblée et je lien de cet objet fichiers avec le C-code.
- Ensuite, il y a encore moins de chance il ne peut y avoir d'optimisation de l'assembleur routines au sein de l'ensemble de la structure de votre code. Ne vous méprenez pas, je ne suis pas frapper d'essayer de gagner de la vitesse à l'aide de l'assembleur, je pense que ça pourrait toujours être plus rapide aussi, mais toujours de comparer les performances de votre code associé à l'assemblage de la performance du code écrit dans droit en C avec les optimisations du compilateur (
-O3
sur la plupart des-Ofast
pour la version de gcc >= 4.6.0). Les compilateurs sont assez bien à l'optimisation d'aujourd'hui et 9 fois sur 10 la droite C est plus rapide. - OK, merci je vais garder cela à l'esprit. Le plus gros problème que j'ai, c'est le fait qu'il n'existe pas de manière simple en C pour vérifier l'état du pavillon et de l'utiliser dans d'autres opérations. Donc pour le moment j'utilise le bit le Plus Significatif du type entier non signé que le porte drapeau. Mais je ne suis pas vraiment satisfaite du résultat. C'est pourquoi je veux mettre en œuvre la logique de base de la soustraction et l'ajout en assembleur. Mais peut-être quelqu'un a une meilleure idée pour le faire. Je suis toujours ouvert à d'autres suggestions.
Vous devez vous connecter pour publier un commentaire.
De retenue est de transporter ou d'emprunter de bit le Plus Significatif (MSb):
Ne pas associer le CF avec le bit de signe, dans une soustraction CF est définie lorsque la minuend, traités comme des non signé, est inférieure à la soustraction, traités comme des non signé.
Cela équivaut à une condition de dépassement de capacité, pour les nombres signés l'équivalent du pavillon est DE.
Pour un (inutiles?) indication visuelle, dans cette 4-5 opération, il est le deuxième emprunter, la red one, le jeu le FC
Pas si vous soustrayez à partir de zéro, il est naturel que, pour tout nombre, mais zéro lui-même, vous aurez toujours le CF, comme la soustraction a au moins un ensemble de bits.
Enfin, des instructions vous permettent de modifier le bit de signe, sans affecter le CF (voir, par exemple, la logique des opérations ou le comportement de
neg
).neg
fait effet le drapeau de portage si.Nous savons de l'école primaire que a - b = a + (-b). Et c'est la façon dont la logique ne nous ne pas nous soustraire ajouter la négative. Nous savons également débutant en programmation classes avec complément à deux pour obtenir le négatif, vous inverser et ajouter un. a - b = a + (~b) + 1. Nous savons aussi à partir de l'école primaire, le concept de la réalisation. 9+3 = 2 porter la. Même en binaire, avec deux opérandes vous pouvez avoir 1 + 1 = 0 porter la. De sorte que chaque colonne dans la logique des besoins d'un report. Chacun des trois bits dans les deux pièces, les deux opérandes en plus de réaliser et d'exécuter des et la conséquence. Puisque chacun de ces logique gouttes dispose d'une entrée peu, dans, plus normal que d'abord procéder à zéro, mais pour la soustraction, nous pouvons faire que de porter dans un 1 et d'inverser le deuxième opérande pour obtenir a + b = a + (~b) + 1
Si la soustraction est plus, si vous travaillez à travers quelques exemples simples, ou mieux essayer tous les trois combinaison de bits des opérandes vous-même. Vous verrez que il y a pas une telle chose comme signé ou non signé l'addition (ou la soustraction), la beauté de complément à deux de codage.
Sachant tout cela, la soustraction est l'addition, avec l'ajout de nous obtenir un report sur UNSIGNED de débordement, la signature du bit de dépassement de capacité, c'est quand la réaliser en et les de la msbit ne correspondent pas, généralement représenté comme le V drapeau. Maintenant, certaines architectures, car ils sont déjà de l'inversion de l'opérande b sur la manière et le transporter sur le chemin dans, ils inversent le mener sur le chemin. CERTAINS N'. Donc, vous avez à regarder votre architecture particulière de comprendre si le report est considéré comme un entier non signé plus de débordement ou si c'est un emprunt. ou pas de l'emprunter ou de quoi que ce soit.
zéro moins quelque chose n'est pas toujours allez avoir a prendre pour l'ajout.
Le transporter hors de l'addition est de zéro. Votre architecture peut choisir de laisser ou il peut choisir de les renverser et de l'appeler un emprunt.
Au sein d'une architecture de la famille. Tous les x86s ou toutes les Armes, il est probable qu'ils continueront à le faire de la même manière pour toujours. Mais il n'y a aucune raison de s'attendre ARM et MIPS et x86 et XYZ à tout faire de la même façon.
En l'inversant et en le définissant comme un emprunter un sens d'un point de vue de la terminologie.
Noter que la totalité de l' (signé/non signé) supérieur à, inférieur à, supérieur ou égal, inférieur ou égal définitions sont basées sur le carry/emprunter choix pour que l'architecture, on ne peut pas traduire ceux drapeau comparisions à travers les architectures à moins qu'ils aient la même définition.