82 votes

Pourquoi la plage d'octets -128 à 127 en Java?

Je ne comprends pas pourquoi la valeur la plus basse d'un octet peut prendre est - -128. Je peux voir que la valeur la plus élevée est 127, parce que c'est 01111111 en binaire, mais comment fait-on pour représenter -128 avec seulement 8 bits, qui est utilisé pour le signe? Positif 128 serait déjà 8-bits, c'est à dire 10000000, puis vous avez besoin d'une 9ème bit pour représenter le signe négatif.

Quelqu'un pourrait s'il vous plaît aidez-il m'expliquer cela.

97voto

Tyler McHenry Points 35551

La réponse est en complément à deux.

En bref, Java (et de la plupart des langues modernes) ne représentent pas des nombres entiers signés à l'aide de signé-l'ampleur de la représentation. En d'autres termes, un entier 8 bits n'est pas un bit de signe, suivi par un 7 bits entier non signé.

Au lieu de cela, les entiers négatifs sont représentés dans un système qui s'appelle le complément à deux, qui permet de faciliter l'arithmétique de traitement dans le matériel, et élimine également le potentiel de l'ambiguïté d'avoir zéro positif et négatif de zéro. Un effet secondaire de l'élimination de zéro négatif est qu'il y a toujours un nombre négatif est disponible au bas de la gamme.

Une autre propriété intéressante de complément à deux systèmes est que le premier bit n'est effectivement fonctionner comme un signe indicateur (c'est à dire tous les numéros commençant par le bit 1 est négatif), mais les sept bits ne doivent pas être interprétées sur leur propre comme un nombre non signé à laquelle le bit de signe est appliquée.

En complément à deux n'est pas très compliqué, mais faire une première bonne adhérence sur ce complément à deux est, et comment et pourquoi il fonctionne, c'est probablement au-delà de la portée d'une SORTE de réponse. Commencer avec l'article de Wikipedia ou google le terme pour plus de ressources.

Pour tenter d'aborder brièvement votre requête sur -128, l'idée de base de la génération d'un complément à deux le nombre est de prendre le unsigned forme de le nombre, inverser tous les bits et les ajouter. Donc, non signé 128 est 10000000. Inversé, c'est 01111111, et en ajoutant l'on obtient 10000000 de nouveau. Donc, en complément à deux système, 10000000 est sans ambiguïté entre -128 et pas +128. Les nombres plus grand que ou égal à +128 simplement ne peut pas être représentée en 8 bits à l'aide d'un complément à deux du système parce qu'ils seraient ambigus avec les formes de nombres négatifs.

8voto

Tamás Szelei Points 8660

Comme James l'a souligné dans son commentaire, c'est parce que c'est comment en complément à deux œuvres.

Si nous mettons en d'autres termes, vous pouvez représenter 2^8 = 256 valeurs. qui est, dans ce cas utilisé comme 128 nombres négatifs, 127 des nombres positifs et zéro. Si l'on utilise 7 bits pour représenter la valeur, +1 bit de signe, on pourrait s'agir d'un moins de valeur et serait également suivi de deux zéros (ce qui serait très regrettable que la comparaison de deux valeurs serait plus compliqué à cause de cela).

1voto

Andrei Bazavan Points 1

en java, toutes les variables comme byte short int long float double sont écrites comme signé . donc est très simple, la tête bits spécifie toujours ce qui est( négatif ou positif), mais parce que les chiffres sont divisibles par 2 demi est déplacé en négatif , 0 est positif par défaut . de sorte qu'il ressemble à ceci :

c'est positif
+|0001001
1/0001001
c'est négatif
-|0001001
0/0001001
comme un octet bref un négatif
-000000011111111
0000000011111111

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X