web-dev-qa-db-fra.com

Pourquoi la plage d'octets signés va de -128 à 127 (complément à 2) et non de -127 à 127?

J'ai lu Pourquoi la plage d'octets -128 à 127 en Java? il dit

128 est 10000000. Inversé, c'est 01111111, et l'ajout d'un obtient à nouveau 10000000

il conclut donc -128 est 10000000

donc +128 ne peut pas être représenté en complément à 2 en 8 bits, mais cela signifie que nous pouvons le représenter en 9 bits, donc 128 est 010000000 et donc prendre son complément à 2 -128 est 110000000,

est donc la représentation de -128 10000000 ou 110000000? Le bit de représentation dépend-il?

Pourquoi ne pas simplement mettre la plage inférieure à -127 pour 8 bits au lieu d'écrire -128 en 10000000?

24
Anubha

Pourquoi la plage d'octets non signés est -128 à 127?

Ce n'est pas. Un octet non signé (en supposant 8 bits) est compris entre 0 et 255.

La plage d'un octet signé utilisant le complément à 2 va de -128 à 127, directement à partir de la définition de complément à 2 :

01111111 = +127
01111110 = +126
01111101 = +125
...
00000001 = +1
00000000 =  0
11111111 = -1
...
10000010 = -126
10000001 = -127
10000000 = -128

est donc la représentation de -128 10000000 ou 110000000?

En 8 bits, c'est 10000000, dans une représentation hypothétique à 9 bits, c'est 110000000.

Pourquoi ne pas simplement faire la gamme inférieure -127 pour 8 bits?

Limiter artificiellement la plage à -127 n'apporterait pas grand-chose; vous interdiriez une valeur parfaitement valide et rendriez généralement le code plus complexe (que feriez-vous d'autre avec le modèle de bits 10000000?).

39
Oliver Charlesworth

est donc la représentation de -128 10000000 ou 110000000? Le bit de représentation dépend-il?

Oui, la représentation du complément à 2 dépend du bit

Pourquoi ne pas simplement mettre la plage inférieure à -127 pour 8 bits au lieu d'écrire -128 en 10000000

2 ^ 8 = 256. Donc, quel que soit le schéma de représentation que vous utilisez, il devrait pouvoir représenter 256 valeurs différentes.

Et vous pouvez dessiner un cercle pour comprendre à quel point le système de complément de 2 est bon.

Regardez d'abord ce tableau:

Bits    Unsigned 2's complement
00000000    0   0
00000001    1   1
00000010    2   2
01111110    126     126
01111111    127     127
10000000    128     −128
10000001    129     −127
10000010    130     −126
11111110    254     −2
11111111    255     −1

pour le système complémentaire de 2, vous pouvez dessiner un cercle pour comprendre ce système.

Voici la version 4 bits. Vous pouvez facilement développer une version 8 bits sur vous-même. Ce cercle représente ce que le système de complément de 2 est réellement. C'est un système circulaire. Cela signifie que sa représentation dépend de la "durée" que vous lui donnez. c'est pourquoi la version 8 bits d'un nombre négatif diffère d'une version 16 bits du même nombre négatif. vous pouvez comparer le même nombre négatif dans la version 4 bits indiquée dans le cercle avec la version 8 bits indiquée dans le tableau.

                      0000  0
                 1111  -1     0001  1


        1110  -2                       0010  2




  1101  -3                                   0011  3



1100  -4                                       0100  4



  1011  -5                                   0101  5




        1010  -6                       0110  6


                 1001  -7     0111  7
                          1000  -8

D'un autre côté, l'arithmétique du complément à 2 joue bien avec les stockages de calcul de largeur "fixe" à l'intérieur des ordinateurs (registres, mémoire, etc.).

Dans les ordinateurs de première génération, il y avait une tendance à fournir une arithmétique décimale native. Mais cela a été rapidement abandonné au profit d'un schéma "complémentaire" ou "circulaire" car, l'arithmétique décimale est bizarre du point de vue d'un ordinateur. Nous le trouvons naturel car "nous avons 10 doigts". Ces doigts étaient le premier outil de calcul de notre ancêtre. c'est pourquoi nous trouvons le système décimal si naturel. son intégré dans nos gènes.

17
Aftnix

Les alternatives au complément à deux seraient

  • son complément , qui a des problèmes en raison de son "zéro négatif"
  • signe/amplitude , qui a également un zéro négatif
  • ne pas attribuer de sens à 10000000, auquel cas de nombreuses fonctions qui acceptent des entiers 8 bits signés devront vérifier cette valeur non valide, ce qui fait perdre du temps. (À moins que votre code ne fonctionne sur un matériel hypothétique qui traite ce modèle de bits comme un entier NaN.)

Il est plus facile d'attribuer simplement une signification à ce motif binaire, et la signification naturelle dans la représentation du complément à deux est -128.

Par exemple, en complément à deux, vérifier si le montage est négatif pour vérifier si son bit le plus élevé est défini. Dans une variante où 10000000 n'est pas valide, c'est (pseudocode)

if (highest_bit_zero(x))
    return false;
else if (x == 0b10000000)
    ERROR
else
    return true;

Vous décidez comment gérer l'erreur :)

6
Fred Foo

est donc la représentation de -128 10000000 ou 110000000? Le bit de représentation dépend-il?

Dans un monde 9 bits, ce serait 110000000. Dans un monde 16 bits, ce serait 1111111110000000. Du moins, tant que nous parlons du complément à deux.

Pourquoi ne pas simplement mettre la plage inférieure à -127 pour 8 bits au lieu d'écrire -128 en 10000000?

Comme l'a souligné Larsmans, vous vous retrouveriez avec une valeur "invalide", que vous auriez constamment à vérifier. Le complément à deux a été choisi parce qu'il est si facile à manipuler pour l'ALU. Tout comme les largeurs d'octets ont été choisies pour être une puissance de deux (ce qui n'était pas toujours le cas non plus). Au niveau matériel, l'ajout de complément à deux est identique à non signé, donc aucune instruction spéciale ni matériel supplémentaire n'est nécessaire (contrairement à son complément).

Avec les choses telles qu'elles sont, toutes les valeurs avec le bit le plus élevé sont négatives, toutes les valeurs avec le bit le plus élevé non défini ne sont pas négatives (positives ou nulles). Facile, non? La plage négative étant une plus grande que la plage positive est simplement un artefact d'essayer de garder simple le complément à deux.

3
DevSolar

Raison pour laquelle vous ne pouvez pas avoir une plage de enter image description here à enter image description here .

On dirait enter image description here et enter image description here sont représentés par le même motif. Ce n'est pas bien. Un entier non nul et son négatif ne peuvent pas tous les deux être représentés par le même motif. Donc enter image description here ne peut pas être représenté sur huit bits. L'entier positif maximum qui peut être représenté sur huit bits est enter image description here .

Quel nombre est représenté par 1000 0000? Ajoutez la représentation de enter image description here pour lui:

enter image description here

Un bon choix pour? est enter image description here . Par conséquent, 1000 0000 représente enter image description here . Huit bits peuvent être utilisés pour représenter les nombres enter image description here ... 0 ... enter image description here .

enter image description here

Par exemple, la plage d'entiers pouvant être représentés sur huit bits à l'aide du complément à deux est:

Example

Notez qu'un nombre entier négatif de plus peut être représenté que des nombres entiers positifs.

Source: - http://programmedlessons.org/AssemblyTutorial/Chapter-08/ass08_20.html

2
Varun