481 votes

Qu'est-ce que “Complément de 2”?

Je suis dans l'un des systèmes informatiques, et avoir été en difficulté, en partie, avec en Complément à Deux. Je tiens à le comprendre, mais tout ce que j'ai lu n'a pas apporté la photo de concert pour moi. J'ai lu l' article de wikipédia et divers autres articles, y compris mon livre de texte.

Donc, je voulais commencer ce wiki de la communauté post pour définir ce en Complément à Deux est, comment l'utiliser et comment il peut affecter des numéros de cours d'opérations comme celles jette (à partir de signé non signé et vice-versa), bit-wise opérations et de décalage de bit opérations.

Ce que j'espère c'est une définition claire et concise qui est facile à comprendre par un programmeur qui n'est pas titulaire d'un Doctorat (ou même un B. S.) en Informatique. (J'ai plus d'un logiciel d'ingénierie B. S. et suis à la poursuite d'un M. S. en Génie Logiciel).

686voto

lavinio Points 12592

En complément à deux est un habile moyen de stocker des nombres entiers, de sorte que le commun des problèmes de mathématiques sont très simples à mettre en œuvre.

Pour comprendre, il faut penser à les nombres en binaire.

Il dit en fait,

  • pour le zéro, utiliser 0.
  • pour des entiers positifs, commencer à compter, avec un maximum de 2(nombre de bits - 1)-1.
  • pour les entiers négatifs, faire exactement la même chose, mais passer du rôle de 0 et de 1 (donc, au lieu de commencer avec 0000, commencer avec 1111 - c'est le "complément" de la partie).

Faites un essai avec un mini-octet de 4 bits (nous allons l'appeler un nibble - 1/2 un octet).

  • 0000 - zéro
  • 0001 - un
  • 0010 - deux
  • 0011 - trois
  • 0100 de 0111 - de quatre à sept

C'est aussi loin que nous pouvons nous rendre positifs. 23-1 = 7.

Pour les points négatifs:

  • 1111 - négatif
  • 1110 - négatif deux
  • 1101 - négatifs trois
  • 1100 de 1000 - négatif de quatre à huit négatif

Notez que vous obtenez une valeur supplémentaire pour les négatifs (1000 = -8) que vous n'avez pas des positifs. C'est parce qu' 0000 est utilisé pour le zéro.

Ce faisant, le premier bit obtient le rôle de "signe" peu, car il est toujours à '1' pour les nombres négatifs, et '0' pour les non-négatifs (zéro et positif).

Cela vous aide?

371voto

Vincent Ramdhanie Points 46265

Je me demande si cela pourrait être expliqué mieux que l'article de Wikipedia.

Le problème de base que vous essayez de résoudre avec en complément à deux de la représentation est le problème de stockage des entiers négatifs.

D'abord envisager un entier non signé stockées sur 4 bits. Vous pouvez avoir la suite

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Ce sont des non signé car il n'y a aucune indication qu'ils soient négatifs ou positifs.

Pour stocker des nombres négatifs, vous pouvez essayer un certain nombre de choses. Tout d'abord, vous pouvez utiliser le signe de l'ampleur de la notation qui attribue le premier bit est un bit de signe pour représenter les +/- et le reste des bits pour représenter l'ampleur. Donc, à l'aide de 4 bits à nouveau et en supposant que 1 signifie - et 0 signifie +, alors vous avez

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Donc, vous voyez le problème - vous avez positifs et négatifs 0. Le problème le plus important est l'ajout et soustraction de nombres binaires. Les circuits d'ajouter et de soustraire à l'aide de magnitude de signe sera très complexe.

Qu'est-ce que

0010
1001 +
----
?

Un autre système est l'excès de notation. Vous pouvez stocker des nombres négatifs, à vous débarrasser des deux zéros problème, mais l'addition et la soustraction reste difficile.

Donc le long de vient en complément à deux. Maintenant, vous pouvez stocker des entiers positifs et négatifs et d'effectuer des calculs arithmétiques avec une relative facilité. Il y a un certain nombre de méthodes pour convertir un nombre en complément à deux. En voici un:

  1. Convertir le nombre binaire (ignorer le panneau pour l'instant) par exemple, 5 est 0101 et -5 est 0101

  2. Si le nombre est un nombre positif, alors vous êtes fait. par exemple, 5 est 0101 en binaire à l'aide de deux compliment notation.

  3. Si le nombre est négatif alors

    3.1 trouver le complément (inversion de 0 et de 1) par exemple -5 est 0101 afin de trouver le complément est de 1010

    3.2 Ajouter 1 à la compléter 1010 + 1 = 1011 Donc -5 est 1011 en binaire à l'aide de notation en complément à deux.

Donc si vous voulais faire 2 + (-3) en binaire? 2 + (-3) est de -1. Que devriez-vous faire si vous avez été en utilisant le signe de l'ampleur à ajouter à ces chiffres? 0010 + 1011 = ? À l'aide de deux en complément à examiner comment il serait facile de.

 2 =  0010
 -3 = 1101 +
 and the answer is 1111

La conversion 1111 de décimales que l'on

  1. Le numéro commence par 1, donc son négatif, donc le complément = 0000
  2. Ajouter 1 = 0001
  3. Convertir en décimal = 1
  4. Appliquer le signe = -1

Tada!

135voto

ForDummies Points 11

Comme la plupart des explications que j'ai vu, ceux ci-dessus sont claires sur la façon de travailler avec complément de 2, mais n'a pas vraiment expliquer ce qu'ils sont mathématiquement. Je vais essayer de faire ça, pour les entiers au moins, et je vais couvrir certains d'arrière-plan qui est probablement familier.

Rappelez-vous comment il fonctionne pour les décimales:
  2345
est une façon d'écrire
  2 × 103 + 3 × 102 + 4 × 101 + 5 × 100.

De la même manière, le binaire est une manière d'écrire les nombres à l'aide de seulement 0 et 1 suivant la même idée générale, mais le fait de remplacer ces 10s ci-dessus avec 2s. Puis en binaire,
  1111
est une façon d'écrire
  1 × 23 + 1 × 22 + 1 × 21 + 1 × 20
et si vous en sortir, qui s'avère égal à 15 (base 10). C'est parce que c'est
8+4+2+1 = 15.

C'est bien beau pour les nombres positifs. Il fonctionne même pour les nombres négatifs, si vous êtes prêt à coller un signe moins devant eux, comme le font les humains avec des nombres décimaux. Qui peut même être effectuée dans les ordinateurs, en quelque sorte, mais je n'ai pas vu un tel ordinateur depuis le début des années 1970. Je vais laisser les raisons pour une autre discussion.

Pour les ordinateurs, il s'avère être plus efficace d'utiliser un complément de la représentation des nombres négatifs. Et voici quelque chose qui est souvent négligé. Compléter les notations impliquent une sorte d'inversion des chiffres du nombre, même implicite des zéros qui précèdent une normale nombre positif. C'est maladroit, parce que la question se pose: tous? Qui pourrait être un nombre infini de chiffres pour être considéré.

Heureusement, les ordinateurs ne sont pas infinis. Les nombres sont limités à une longueur (ou largeur, si vous préférez). Donc, revenons-en à l'positifs des nombres binaires, mais avec une taille particulière. Je vais l'utiliser à 8 chiffres ("bits") pour ces exemples. Donc, notre nombre binaire serait vraiment
  00001111
ou
  0 × 27 + 0 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 20

Pour former le complément de 2 négatif, nous avons d'abord compléter tous les (binaire) de chiffres pour la forme
  11110000
et d'ajouter 1 à la forme
  11110001
mais comment devons-nous comprendre que pour signifier -15?

La réponse est que nous avons de changer le sens de la haute-bit afin de. Ce bit sera un 1 pour tous les nombres négatifs. Le changement sera de changer le signe de sa contribution à la valeur du nombre, il apparaît dans. Alors maintenant, notre 11110001 est compris pour représenter
-1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20
Notez que "-" en face de cette expression? Cela signifie que le bit de signe porte le poids -27, c'est-à -128 (en base 10). Toutes les autres positions de conserver le même poids qu'ils avaient en non signé binaire des nombres.

La préparation de notre -15, il est
-128 + 64 + 32 + 16 + 1
Essayez-la sur votre calculatrice. c'est -15.

De trois façons principales que j'ai vu les nombres négatifs représentés dans les ordinateurs, les 2 en complément à l'emporte, pour plus de commodité dans l'utilisation générale. Il a une curiosité, si. Depuis c'est du binaire, il doit y avoir un même nombre possible de combinaisons binaires. Chaque nombre positif peut être couplé avec son négatif, mais il y a seulement un zéro. En niant un zéro vous obtient zéro. Donc, il y a encore une combinaison, le numéro 1 dans le bit de signe et 0 partout ailleurs. Le correspondant de nombre positif ne rentrait pas dans le nombre de bits utilisés.

Ce qui est encore plus étrange à propos de ce numéro, c'est que si vous essayez de forme positive, en le complétant et en ajoutant un, vous obtenez le même nombre négatif en arrière. Il semble naturel que nul ne cela, mais ce qui est inattendu et pas du tout le comportement que nous sommes habitués à car les ordinateurs de côté, on pense généralement un approvisionnement illimité de chiffres, pas de longueur fixe de l'arithmétique.

C'est comme la pointe d'un iceberg de bizarreries. Il n'y a plus à l'affût au-dessous de la surface, mais c'est assez pour cette discussion. Vous pourriez probablement trouver plus de si vous la recherche de "débordement" pour les points fixes de l'arithmétique. Si vous voulez vraiment obtenir, vous pouvez aussi faire une recherche sur "l'arithmétique modulaire".

23voto

Simon Yundov Points 38

Complément de 2 est très utile pour trouver la valeur d'un binaire, cependant j'ai pensé à une beaucoup plus concis façon de résoudre un tel problème(jamais vu quelqu'un d'autre de le publier):

prendre un binaire, par exemple: 1101 [en supposant que l'espace "1" est le signe] égal à -3.

à l'aide de 2 en complément à nous faire...flip 1101 à 0010...ajouter 0001 + 0010 ===> donne nous 0011. 0011 positive binaire = 3. donc 1101 = -3!

Ce que j'ai réalisé:

au lieu de tous les retourner et ajouter, il vous suffit de faire la méthode de base pour la résolution d'un effet positif binaire(disons 0101) (23 * 0) + (22 * 1) + (21 * 0) + (20 * 1) = 5.

Faire exactement le même concept avec un négatif!(avec un petit twist)

prendre 1101, par exemple:

pour le premier numéro au lieu de 23 * 1 = 8 , (23 * 1) = -8.

puis continuer comme d'habitude, en faisant -8 + (22 * 1) + (21 * 0) + (20 * 1) = -3

16voto

Captain Segfault Points 1106

Imaginez que vous avez un nombre fini de bits/trits/chiffres/whatever. Vous définissez 0 comme tous les chiffres de 0, et le comte naturellement vers le haut:

00
01
02
..

Finalement, vous aurez le débordement.

98
99
00

Nous avons deux chiffres, et peut représenter tous les nombres de 0 à 100. Tous ces nombres sont positifs! Supposons que nous voulons représenter les nombres négatifs?

Ce que nous avons vraiment est un cycle. Le nombre avant le 2 est 1. Le nombre avant le 1er est de 0. Le numéro avant de le 0... 99.

Donc, pour simplifier, disons qu'un nombre de plus de 50 est négative. "0", "49" représentent de 0 à 49. "99" est -1, "98" est de -2, ... "50" est -50.

Cette représentation est dix complément. Les ordinateurs utilisent généralement en complément à deux, qui est le même, sauf à l'aide de bits au lieu de chiffres.

La bonne chose à propos de ces dix complément est que plus fonctionne, tout simplement. Vous n'avez pas besoin de faire quelque chose de spécial à ajouter les nombres positifs et négatifs!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X