java - ¿Por qué byte b=(byte) 0xFF es igual a entero-1?
bit twos-complement (7)
¿Por qué byte b = (byte) 0xFF
es igual a integer
-1
?
Ex:
int value = byte b = (byte) 0xFF;
System.out.println(value);
se imprimirá -1
?
b
se promueve a unint
para determinar qué sobrecarga desystem.out.println
llamar.Todos los bytes en Java están firmados.
El byte firmado
0xff
representa el valor-1
. Esto se debe a que Java utiliza el complemento de dos para representar valores firmados. El byte con signo0xff
representa-1
porque su bit más significativo es1
(por lo tanto, representa un valor negativo) y su valor es-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
.
Debido a que Java (y la mayoría de los lenguajes) representan valores enteros negativos utilizando http://en.wikipedia.org/wiki/Two%27s_complement . En complemento a dos, 0xFF (11111111) representa (en un int firmado) el valor -1.
Los bytes son firmados en Java. En binario, 0x00 es 0, 0x01 es 1 y así sucesivamente, pero todos los 1s (es decir, 0xFF) es -1, 0xFE es -2 y así sucesivamente. Vea el complemento de Dos , que es el mecanismo de codificación binario utilizado.
No es solo Java que hace el complemento de 2 de matemáticas. Esa es la forma en que cada microprocesador y DSP en que puedo pensar hace matemáticas. Por lo tanto, es la forma en que cada lenguaje de programación lo representa.
Si está utilizando un int firmado, entonces 0xFF = -1 debido al complemento 2.
Este artículo de wiki lo explica bien, vea la tabla a la derecha: http://en.wikipedia.org/wiki/Two%27s_complement
modulo reducido
byte = 256 0xff = 255
255/256 -> resto 255
Entonces 255 - 256 = -1
Aclamaciones de lógica simple
quizás su confusión proviene de por qué (byte)0xFF
es de alguna manera igual a (int)0xFFFFFFFF
. Lo que está sucediendo aquí es que la promoción de tipos más pequeños a más firmes hace que el valor más pequeño se extienda , por lo que el bit más significativo se copia en todos los nuevos bits del valor promovido. un tipo sin signo no se ampliará con el signo, se extenderá a cero, los nuevos bits siempre serán cero.
Si le ayuda a tragarlo, piénselo de esta manera, cada entero de cualquier tamaño también tiene algunos bits "fantasmas" que son demasiado significativos para ser representados. están ahí, simplemente no almacenados en la variable. un número negativo tiene esos bits distintos de cero, y los números positivos tienen todos ceros para los bits fantasmas cuando promueves un valor menor a uno mayor, esos bits fantasmas se convierten en bits reales.