Je ne comprends pas pourquoi la valeur la plus basse qu'un octet puisse prendre est -128
. Je peux voir que la valeur la plus élevée est 127
, parce que c'est 01111111
en binaire, mais comment peut-on représenter -128
avec seulement 8 bits, dont l'un est utilisé pour le signe? Le positif 128 serait déjà 8 bits, c'est-à-dire 10000000
, et vous auriez alors besoin d'un neuvième bit pour représenter le signe négatif.
Quelqu'un pourrait-il s'il vous plaît aider à m'expliquer cela.
La réponse est complément de deux .
En bref, Java (et la plupart des langages modernes) ne représente pas les entiers signés utilisant une représentation en amplitude signée. En d'autres termes, un entier de 8 bits n'est pas un bit de signe suivi d'un entier de 7 bits non signé.
Au lieu de cela, les entiers négatifs sont représentés dans un système appelé complément à deux, ce qui facilite le traitement arithmétique dans le matériel et élimine également l'ambiguïté potentielle d'avoir un zéro positif et un zéro négatif. Un des effets secondaires de l'élimination du zéro négatif est qu'il existe toujours un nombre négatif supplémentaire disponible au bas de la plage.
Une autre propriété intéressante des systèmes du complément à deux est que le premier bit sert effectivement comme indicateur de signe (tous les nombres commençant par le bit 1 sont négatifs), mais que les sept bits suivants ne doivent pas être interprétés séparément. un numéro non signé auquel le bit de signe est appliqué.
Le complément de deux n'est pas terriblement compliqué, mais obtenir une bonne idée initiale de ce qu'est le complément de deux et comment et pourquoi cela fonctionne dépasse probablement le cadre d'une réponse SO. Commencez avec l'article de Wikipedia ou google le terme pour plus de ressources.
Pour essayer de répondre brièvement à votre question sur -128, l’idée de base pour générer un nombre complémentaire de deux est de prendre la forme non signée du nombre, d’inverser tous les bits et d’en ajouter un. Donc, 128, non signé, correspond à 10000000. Inversé, il s’agit du 01111111, et l’ajout d’un renvoie 10000000 à nouveau. Ainsi, dans un système à complément à deux, 10000000 correspond sans ambiguïté à -128 et non à +128. Les nombres supérieurs ou égaux à +128 ne peuvent tout simplement pas être représentés sur 8 bits avec un système de complément à deux, car ils seraient ambigus avec les formes des nombres négatifs.
Le complément de deux fonctionne comme suit;
Un octet est composé de 8 bits.
00000000 signifie 0
11111111 signifie 255
Toutefois, si les chiffres étaient présentés ainsi, nous ne pourrions pas différencier le nombre de résultats positifs ou négatifs. Pour cette raison, le bit de gauche nous donne cette information. Si le bit à gauche est 0
, vous pouvez commencer à ajouter la valeur des autres bits au sommet de zero
. Si le bit est 1
, vous devriez commencer à ajouter en haut de -128
. Parce que le bit sur le côté gauche est deux à la puissance de sept.
Exemples;
Dans ces exemples, le bit à gauche est 1, cela signifie que nous ajoutons les valeurs des autres bits au-dessus de -128.
10000000 = -128 (-128 + 0)
10000001 = -127 (-128 + 1)
10000011 = -125 (-128 + 3)
10000111 = -121 (-128 + 7)
Mêmes octets mais cette fois, le bit à gauche est 0
. Cela signifie que nous commençons à ajouter au sommet de 0
.
00000000 = 0 (0 + 0)
00000001 = 1 (0 + 1)
00000011 = 3 (0 + 3)
00000111 = 7 (0 + 7)
Si tout va bien jusqu'à présent, la réponse à votre question est que le nombre le plus petit possible avec 8 bits avec cette règle est;
10000000 = -128
le plus grand nombre possible
011111111 = 127
C'est pourquoi, la plage est comprise entre -128 et 127 .
Comme James l'a souligné dans son commentaire, c'est parce que c'est ainsi que fonctionne le complément à deux.
En d'autres termes, vous pouvez représenter 2 ^ 8 = 256 types de valeurs. qui est, dans ce cas, utilisé comme 128 nombres négatifs, 127 nombres positifs et zéro. Si nous utilisions 7 bits pour représenter la valeur, +1 bit pour un signe, nous pourrions représenter une valeur de moins et disposer de deux zéros (ce qui serait très regrettable, car comparer deux valeurs serait plus compliqué à cause de cela).
Les types numériques de base peuvent représenter 2 ^ n nombres. Regardez un cas n = 2. Vous pouvez représenter quatre cas, appelons-les a, b, c, d. Ensuite, vous pouvez accepter soit a=-2, b=-1, c=0, d=1
(c'est accepté) ou a=-1, b=0, c=1, d=2
(Possible, mais non utilisé). Donc, si vous avez seulement un zéro et maintenez 2 ^ n états votre abs(min) != max
Augmenter la n
déplace les bordures, mais abs(min) != max
est toujours valable.
octet composé de 8 bits ---> 1 bit signe (positif ou négatif) valeur de 7 bits
donc la gamme -2 ^ 7 négative (-128) à 2 ^ 7 -1 positive (127)
en Java, toutes les variables telles que byte short int long float double sont écrites comme suit . est donc très simple, le bit de tête spécifie toujours ce qui est (négatif ou positif), mais parce que les nombres sont divisibles par 2, la moitié est décalée de manière négative , 0 est positif par défaut ., Il se présente ainsi:
c'est positif
+ | 0001001
1 | 0001001
c'est négatif
- | 0001001
0 | 0001001
sous forme d'octet bref un négatif est
- 000000011111111
0000000011111111
après avoir pris le complément de nombre à deux, nous sommes toujours partis avec un seul état représentant le nombre supplémentaire;.
Sans entrer dans le complément à deux: 2 ^ 8 (puisqu’un octet est composé de 8 chiffres et peut avoir 1 ou 2 valeurs) = 256, la valeur la plus individuelle qu’un octet puisse représenter est donc 256. , Représentant les nombres -128 à -1 est la moitié de notre gamme. Je crois que la question qui se pose est de savoir pourquoi la valeur maximale positive est 127 plutôt que 128. C'est parce que nous devons représenter le nombre 0, de sorte que 0-127 est inclusivement les 128 autres possibilités de notre gamme.
Si nous ne permettions que des valeurs positives, telles qu'un octet non signé où les nombres négatifs ne sont pas possibles, la plage serait comprise entre 0 et 255, car il s'agit de 256 valeurs différentes (y compris le 0).