2009-11-05 19 views

Respuesta

1

Debido Java (y la mayoría de los idiomas) representan valores enteros negativos utilizando two's-complement math. En el complemento de dos, 0xFF (11111111) representa (en un int firmado) el valor -1.

17

Los bytes se firman en Java. En el binario 0x00 es 0, 0x01 es 1 y así sucesivamente, pero todos los 1 (es decir, 0xFF) son -1, 0xFE es -2 y así sucesivamente. Ver Two's complement, que es el mecanismo de codificación binario utilizado.

+2

Y Java está haciendo extensión de signo al expandir el byte a un int. http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301

+0

realidad extensión de signo es la recta razón de HTE –

13
  1. b es promovido a un int en la determinación de lo que la sobrecarga de system.out.println para llamar.

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

  3. El byte con signo 0xff representa el valor -1. Esto se debe a que Java usa two's complement para representar valores firmados. El byte firmado 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.

-1

No es solo Java que hace el complemento 2 de las matemáticas. Esa es la forma en que cada microprocesador y DSP que se me ocurre hace matemáticas. Entonces, es la forma en que todo lenguaje de programación lo representa.

+2

Estrictamente hablando, algunos idiomas (por ejemplo, C y C++) no especifican qué representación se utiliza para los números enteros. Es específico de la plataforma. por el contrario Java * * no especifica representación de complemento a 2. –

5

tal vez su confusión proviene de por qué (byte)0xFF es de alguna manera igual a (int)0xFFFFFFFF. Lo que sucede aquí es que la promoción de tipos firmados de menor a mayor causa que el valor más pequeño sea con signo extendido, por lo que el bit más significativo se copia en todos los nuevos bits del valor promocionado. un tipo sin signo no se extenderá, se extenderán cero, los nuevos bits siempre serán cero.

Si le ayuda a tragar, piénselo de esta manera, cada número entero de cualquier tamaño también tiene algunos bits "fantasmas" que son demasiado importantes para ser representados. están ahí, simplemente no están almacenados en la variable. un número negativo tiene esos bits distintos de cero, y los números positivos tienen todos los ceros para los bits fantasmas cuando promocionas un valor más pequeño a uno más grande, esos bits fantasmas se convierten en bits reales.

-1

reducido módulo

byte = 256 0xff = 255

255/256 -> 255 restantes

So 255 - 256 = -1

lógica simple Saludos