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?
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
?).
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.
Les alternatives au complément à deux seraient
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 :)
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.
Raison pour laquelle vous ne pouvez pas avoir une plage de à .
On dirait et 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 ne peut pas être représenté sur huit bits. L'entier positif maximum qui peut être représenté sur huit bits est .
Quel nombre est représenté par 1000 0000? Ajoutez la représentation de pour lui:
Un bon choix pour? est . Par conséquent, 1000 0000 représente . Huit bits peuvent être utilisés pour représenter les nombres ... 0 ... .
Par exemple, la plage d'entiers pouvant être représentés sur huit bits à l'aide du complément à deux est:
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