web-dev-qa-db-fra.com

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

Je regardais ceci vidéo sur les valeurs maximum et minimum 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?

14
discussedtree

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 complément à deux. L'autre façon principale de stocker des nombres signés négatifs est appelée son complément.

Le complément à deux d'un nombre à N bits x est défini comme 2^N - x. Par exemple, le complément à deux de 8 bits 1 est 2^8 - 1, ou 1111 1111. Le complément à deux de 8 bits 8 est 2^8 - 8, qui en binaire est 1111 1000. Cela peut également être calculé en retournant les bits de x et 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, fondamentalement.

 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 manière avec les entiers signés implémentés avec deux complétés comme ils le font avec les entiers non signés.

30
Miles Rout

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 sur 8 bits, la valeur 8 est représentée par 0 0001000 et -8 par 1 0001000.

  2. Complément à un. 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 contre -128).
    Dans le complément à 8 bits deux, la valeur 8 est représentée par 00001000 et -8 par 11111000.

20

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.

2
Pieter B