java bit twos-complement

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 ?


  1. b se promueve a un int para determinar qué sobrecarga de system.out.println llamar.

  2. Todos los bytes en Java están firmados.

  3. 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 signo 0xff representa -1 porque su bit más significativo es 1 (por lo tanto, representa un valor negativo) y su valor es -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -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.



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.