2009-11-05 16 views

Répondre

1

Parce que Java (et la plupart des langues) représentent des valeurs entières négatives en utilisant two's-complement math. Dans le complément à deux, 0xFF (11111111) représente (dans un entier signé) la valeur -1.

17

Les octets sont signés en Java. En binaire 0x00 est 0, 0x01 est 1 et ainsi de suite mais tous les 1s (c'est-à-dire 0xFF) est -1, 0xFE est -2 et ainsi de suite. Voir Two's complement, qui est le mécanisme de codage binaire utilisé.

+2

Et Java fait l'extension de signe lors de l'expansion de l'octet à un int. http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301

+0

En réalité, l'extension de signe est la bonne raison –

13
  1. b est promu à une int dans la détermination de la surcharge system.out.println à appeler.

  2. Tous les octets de Java sont signés. L'octet signé 0xff représente la valeur -1. C'est parce que Java utilise two's complement pour représenter les valeurs signées. L'octet signé 0xff représente -1 car son bit le plus significatif est 1 (donc il représente une valeur négative) et sa valeur est -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1.

-1

Ce n'est pas seulement Java qui fait le complément mathématique de 2. C'est la façon dont chaque microprocesseur et DSP que je peux penser fait des maths. Ainsi, c'est la façon dont chaque langage de programmation le représente.

+2

Strictement parlant, certaines langues (par exemple C et C++) ne spécifient pas quelle représentation est utilisée pour les entiers. C'est spécifique à la plate-forme. D'un autre côté, Java * spécifie la représentation du complément à 2. –

5

peut-être votre confusion vient de pourquoi (byte)0xFF est en quelque sorte égale à (int)0xFFFFFFFF. Qu'est-ce qui se passe ici est la promotion de plus petits types signés plus grands provoque la plus petite valeur à signe étendu, par lequel le bit le plus significatif est copié à tous les nouveaux bits de la valeur promue. un type non signé ne sera pas étendu au signe, il sera étendu à zéro, les nouveaux bits seront toujours à zéro. Si cela vous aide à l'avaler, pensez-y de cette façon, chaque entier de toute taille a aussi des bits fantômes qui sont trop importants pour être représentés. ils sont là, mais pas stockés dans la variable. un nombre négatif a ces bits non nul, et les nombres positifs ont tous des zéros pour les bits fantômes quand vous promouvez une valeur plus petite à un plus grand, ces bits fantômes deviennent des bits réels.

-1

réduit modulo

octet 0xFF = 256 = 255

255/256 -> 255 restantes

So 255 - 256 = -1

logique simple

Vive