Pourquoi byte b = (byte) 0xFF
est égal à integer
-1
?Pourquoi octet b = (octet) 0xFF est égal à entier -1?
Ex:
int value = byte b = (byte) 0xFF;
System.out.println(value);
il imprimera -1
?
Pourquoi byte b = (byte) 0xFF
est égal à integer
-1
?Pourquoi octet b = (octet) 0xFF est égal à entier -1?
Ex:
int value = byte b = (byte) 0xFF;
System.out.println(value);
il imprimera -1
?
Si vous utilisez un entier signé alors 0xFF = -1 en raison du complément 2.
Cet article wiki explique bien, voir le tableau à droite: http://en.wikipedia.org/wiki/Two%27s_complement
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.
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é.
b
est promu à une int
dans la détermination de la surcharge system.out.println
à appeler.
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
.
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.
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. –
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.
réduit modulo
octet 0xFF = 256 = 255
255/256 -> 255 restantes
So 255 - 256 = -1
logique simple
Vive
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
En réalité, l'extension de signe est la bonne raison –