Comment sont stockées les valeurs signées négatives?

13

Je regardais cette vidéo sur les valeurs maximales et minimales des entiers signés.

Prenons un exemple de valeur signée positive - 0000 0001 Le premier bit indique que le nombre est positif et les 7 derniers bits sont le nombre lui-même. Il est donc facilement interprété comme +1.

Prenons maintenant un exemple de valeur signée négative - 1000 0000 qui se révèle être -8. D'accord, l'ordinateur peut comprendre qu'il s'agit d'une valeur négative à cause du premier bit, mais comment diable comprend-il que 000 0000 signifie -8?

En général, comment les valeurs signées négatives sont-elles stockées / interprétées dans un ordinateur?

arbre discuté
la source
nl.wikipedia.org/wiki/Two%27s_complement est la façon dont les nombres binaires sont stockés dans les ordinateurs.
Pieter B
@PieterB Peut-être votre ordinateur. Et beaucoup d'autres. Pour de bonnes raisons! Mais n'implique pas que c'est le seul moyen.
underscore_d
De toute façon, tu l'aimes. Je peux penser à au moins 256! façons de stocker des nombres binaires (8 bits) sur des ordinateurs. Cependant, la plupart d'entre eux sont incroyablement stupides.
Caleth
C ne précise pas, c'est en grande partie comment le fabricant de puces décide de représenter les données. C est compilé en code machine, et il prend soin de ne pas redéfinir comment la puce stocke les nombres. Les mêmes règles s'appliquent aux nombres à virgule flottante. C'est au fabricant de puces de définir comment elles sont stockées. La plupart des fabricants de puces utilisent le complément 2, mais je suis sûr qu'il existe des exceptions.
Berin Loritsch

Réponses:

29

La norme C n'impose aucun moyen particulier de représenter les nombres signés négatifs.

Dans la plupart des implémentations que vous êtes susceptible de rencontrer, les entiers signés négatifs sont stockés dans ce qu'on appelle le complément à deux . L'autre moyen majeur de stocker des nombres signés négatifs est appelé son complément .

Le complément à deux d'un nombre à N bits xest défini comme 2^N - x. Par exemple, le complément à deux de 8 bits 1est 2^8 - 1, ou 1111 1111. Le complément à deux de 8 bits 8est 2^8 - 8, ce qui en binaire est 1111 1000. Cela peut également être calculé en retournant les bits de xet en en ajoutant un. Par exemple:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Le complément à un d'un nombre à N bits x est défini comme x avec tous ses bits inversés, en gros.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

Le complément à deux présente plusieurs avantages par rapport au complément à un. Par exemple, il n'a pas le concept de «zéro négatif», ce qui, pour une bonne raison, prête à confusion pour de nombreuses personnes. L'addition, la multiplication et la soustraction fonctionnent de la même façon avec les entiers signés implémentés avec deux complétés comme ils le font avec les entiers non signés.

Miles Rout
la source
19

Il existe trois méthodes bien connues pour représenter des valeurs négatives en binaire:

  1. Magnitude signée . C'est le plus facile à comprendre, car il fonctionne de la même manière que nous sommes habitués à traiter des valeurs décimales négatives: la première position (bit) représente le signe (0 pour positif, 1 pour négatif), et les autres bits représentent le nombre . Bien que cela soit facile à comprendre pour nous, il est difficile pour les ordinateurs de travailler, en particulier lors de calculs arithmétiques avec des nombres négatifs.
    En amplitude signée 8 bits, la valeur 8 est représentée par 0 0001000 et -8 par 1 0001000.

  2. Un complément . Dans cette représentation, des nombres négatifs sont créés à partir du nombre positif correspondant en inversant tous les bits et pas seulement le bit de signe. Cela facilite le travail avec des nombres négatifs pour un ordinateur, mais a la complication qu'il existe deux représentations distinctes pour +0 et -0. Le retournement de tous les bits rend cela plus difficile à comprendre pour les humains.
    Dans le complément à 8 bits, la valeur 8 est représentée par 00001000 et -8 par 11110111.

  3. Complément à deux . Il s'agit de la représentation la plus couramment utilisée de nos jours pour les nombres entiers négatifs car elle est la plus facile à utiliser pour les ordinateurs, mais elle est également la plus difficile à comprendre pour les humains. Lorsque l'on compare les motifs binaires utilisés pour les valeurs négatives entre le complément à un et le complément à deux, on peut observer que le même motif binaire dans le complément à deux code pour le nombre inférieur suivant. Par exemple, 11111111 représente -0 dans le complément à un et -1 dans le complément à deux, et de même pour 10000000 (-127 vs -128).
    Dans le complément à 8 bits deux, la valeur 8 est représentée par 00001000 et -8 par 11111000.

Bart van Ingen Schenau
la source
8
La magnitude signée comporte également deux zéros.
Jörg W Mittag
+1 pour mentionner le signe / la magnitude. rare et peu pratique (pour les processeurs sinon les humains!), mais mérite d'être connu.
underscore_d
Nous travaillons presque tous avec une ampleur signée, en particulier avec les nombres FP.
Paulo1205
2

Les entiers signés sont stockés à l'aide de http://en.wikipedia.org/wiki/Two%27s%20complement

Vous obtenez alors:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

Fondamentalement, il est très facile de compter, vous comptez jusqu'à la moitié du maximum de l'entier signé. Faites un +1, rendez-le négatif et commencez le compte à rebours.

Pieter B
la source