Les nombres négatifs sont stockées en tant que complément de 2 dans la mémoire, comment le CPU savoir si c'est positif ou négatif?
-1 peut être représenté dans 4 bits en binaire (2 complément) 1111
15 est également représenté 1111.
Alors, comment est-CPU différencier entre 15 et -1 si elle obtient des valeurs de la mémoire?
Vous devez vous connecter pour publier un commentaire.
Le CPU ne se soucie pas de savoir si un octet est titulaire d'-1 ou 15 ans quand il se déplace d'un endroit à un autre. Il n'y a pas une telle chose comme une "signature move" (à l'emplacement de la même taille - il est signé déplacer pour les grandes ou petites destinations).
Le CPU se soucie uniquement de la représentation, quand elle ne l'arithmétique sur l'octet. Le PROCESSEUR sait si le faire signé ou non signé l'arithmétique selon l'op-code que vous (ou le compilateur en votre nom) a choisi.
11111111b + 00000001b
, @amalantony: ce débordements si les deux quantités ne sont pas signés (en supposant que 8bit regs). Il ne déborde pas si elles sont signées. Le compilateur ne peut pas faire la différence si elle ne dispose pas des informations sur le type quelque part (dans l'opcode ou de certains drapeaux par exemple)movsx
.La plupart des réponses ci-dessus mentionné séparer les opcodes. Cela pourrait être vrai pour les opérations plus complexes comme la multiplication et la division, mais pour la simple addition et la soustraction qui n'est pas la façon dont le PROCESSEUR fonctionne.
Le CPU conserve les données relatives au résultat d'une instruction dans son historique des indicateurs. Sur x86 (où je suis le plus familier) les deux plus importants drapeaux voici le "débordement" et "faire" de drapeaux.
Fondamentalement, le CPU n'a pas de soins si le nombre est signé ou non signé il traite à la fois la même. Le porte drapeau est réglé lorsque le nombre va au-dessus de la plus haute valeur non signée, elle peut contenir. Le débordement de l'indicateur est défini lorsqu'il passe au-dessus ou sous la portée d'un nombre non signé. Si vous travaillez avec des nombres non signés-vous de vérifier le report de drapeau et d'ignorer l'indicateur de débordement. Si vous travaillez avec des nombres signés vous vérifiez l'indicateur de débordement et d'ignorer le porte drapeau.
Voici quelques exemples:
Non signé:
1111 (15) + 1111 (15) = 1110 (14)
Ce que vous faites maintenant est de vérifier le drapeau de portage, dans ce cas, contient l'une donnant le résultat final
1 1110 (30)
Signé:
1111 (-1) + 1111 (-1) = 1110 (-2)
Dans ce cas, vous ignorez le drapeau de portage, l'indicateur de débordement doit être mis à zéro.
Non signé:
0111 (7) + 0111 (7) = 1110 (14)
Lorsque vous vérifiez l'indicateur carry elle devrait être nulle.
Signé:
0111 (7) + 0111 (7) = 1110 (-2)
Dans ce cas, l'indicateur de débordement serait de définir le sens qu'il y a une erreur dans l'addition.
Donc en résumé le nombre est signé ou non signé basé sur votre interprétation, la CPU vous donne les outils nessecary de les distinguer, mais ne fait pas de distinction sur son propre.
Le CPU n'est pas de savoir si un nombre est signé ou non signé. Lorsque le compilateur crée la machine de la langue de fichier, il choisit la bonne opération à exécuter pour effectuer une opération mathématique avec ce numéro. Si vous avez déclaré votre variable du type signé, par exemple, que l'opération devant être exécutée en langage machine sera l'une qui considère que la position de mémoire comme une valeur signée.
Dans n'importe quel logiciel de toute nature, il est toujours lorsque vous interprétez les données que vous lui donner un sens. Un octet en mémoire peut être signé ou non signé nombre ou un caractère, ou une partie d'un fichier de musique, ou un pixel dans une image, etc. Ce qui donne du sens est la façon dont vous utilisez cet octet.
Au niveau du compilateur, la différenciation est fondée sur le type de données. Si le type de données est de type int, puis de 4 octets est attribué à cette variable (en C). Donc, 15 en complément de 2 est
00000000 00000000 00000000 00000000 00001111
alors que -1 est11111111 11111111 11111111 11111111
. Le compilateur convertit cette à la correspondante de l'opcode de l'UC. Le PROCESSEUR exécute cet opcode et à ce niveau, tout est dans la forme de 1s et 0s.unsigned char i=255;
Qui est11111111
en binaire.11111111
serait -127 avec un signed char. Le CPU n'ont pas accès à des informations de type à partir de la langue. Comment peut-il dire qui est qui? (Je ne dis pas que la question est en fait responsable, car il est fonction complètement sur le PROCESSEUR réel/jeu d'instructions, juste pour dire que votre réponse ne répond pas à la question.)En complément de 2 à représenter 15 nous avons besoin de 5 bits de la gamme pour 2'complemnt est
-16 à 15,de sorte que la valeur devenu 01111 ici le MSB bit est à 0 donc sa valeur positive pour -1 il deviendra 11111
La plus petite accessibles unité est de 1 octet. 8 bits. En 8-bits de la représentation 15 est stockée en tant que 00001111. Compilateur qui les différencie, entre le positif et le négatif, le nombre de bit de signe. Le MSB est un bit de signe. Si elle est de 0 signifie nombre positif. Si elle est de 1 signifie un nombre négatif. MSB de la représentation binaire de 15 est de 0. Cela signifie nombre positif et 00001111 correspond à +15. 8 bits binaires de -1 est 11111111 comme le MSB est à 1, il est pris d'annonces de nombre négatif. Le compilateur prend d'abord son complément de 2 et le nombre affiché avec un signe négatif. Rappelez-vous, si les 8 bits sont là pour stocker un nombre puis la valeur maximale que vous pouvez stocker dans c'est ( 2^7)-1, qui prend 7 bits dans sa représentation. Cela signifie MSB est toujours à zéro pour un nombre positif. Comme dans votre question si nous supposons que de prendre 4 bits pour stocker le nombre de 3 bits sont disponibles pour stocker la valeur du dernier bit est une réserve de tenir le signe. À 3 bits, la valeur max que peut stocker de l'est (2^3)-1=7. Cela signifie 15 ne peut pas être stockée dans 4bits. Donc 1111 toujours pris comme -1 par le compilateur.
Suivez le lien ci-dessous pour accéder à la chaîne YouTube qui a de telles questions pièges.
http://www.YouTube. com/watch?v=ZxRHOT3pzx4