¿El byte no es complemento a dos con signo?

Dado que byte, short e int están firmados, ¿por qué byte y short en Java no obtienen el habitual complemento a dos firmado tratamiento ? Por ejemplo, 0xff es ilegal para byte.

Esto se ha discutido antes aquí pero no pude encontrar una razón de por qué este es el caso.

preguntado el 03 de mayo de 12 a las 12:05

5 Respuestas

Si observa la memoria real utilizada para almacenar -1 en byte firmado, entonces verás que es 0xff. Sin embargo, en el lenguaje mismo, más que en la representación binaria, 0xff simplemente está fuera del rango de un byte. La representación binaria de -1 de hecho, utilizará el complemento de dos, pero está protegido de ese detalle de implementación.

Los diseñadores del lenguaje simplemente adoptaron la postura de que tratar de almacenar 255 en un tipo de datos que solo puede contener -128 a 127 debería considerarse un error.

Usted pregunta en los comentarios por qué Java permite:

int i = 0xffffffff;

El literal 0xffffffff es un int literal y se interpreta usando complemento a dos. La razón por la que no puede hacer nada similar para un byte es que el lenguaje no proporciona sintaxis para especificar que un literal es del tipo byte, o de hecho short.

No sé por qué se tomó la decisión de no ofrecer tipos más literales. Supongo que se hizo por razones de simplicidad. Uno de los objetivos del lenguaje era evitar la complejidad innecesaria.

contestado el 03 de mayo de 12 a las 13:05

Gracias es bueno saber que la implementación es complemento a dos. Entonces, ¿por qué el lenguaje permite 0xffff_ffff para int? - Sridhar

Puedes escribir

int i = 0xFFFFFFFF;

pero no puedes escribir

byte b = 0xFF;

como el 0xFF es un int valor no un byte por lo que es igual a 255. No hay forma de definir un byte o un literal corto, por lo que debe emitirlo.

Por cierto, puedes hacer

byte b = 0;
b += 0xFF;
b ^= 0xFF;

incluso

byte b = 30;
b *= 1.75; // b = 52.

contestado el 03 de mayo de 12 a las 13:05

Gracias. Recientemente me di cuenta de la conversión implícita en +=. En Java, acepto que 0xff es int. Es lo que es. Pero, en general, 0xff tiene una firma de 8 bits, por lo que debería poder asignarse a un byte. De todos modos, creo que la pregunta está respondida: el byte se implementa como complemento a dos. - Sridhar

Lo que falta es la falta de un tipo de byte literal, por lo que 0xFF solo puede ser 255. No hay forma de escribir 0xFF, que es un byte sin conversión. cf 0xFFL es un long - pedro laurey

Estás en lo correcto. Sin embargo tu puede Escribelo. IE byte b = (byte) 0xFF; Por supuesto, falla como -1 aunque :-) - Edward J. Beckett

@EddieB ¿Quieres decir que falla como byte b = 255; como puedes escribir byte b= -1; - pedro laurey

@peter-lawrey Sí, señor. Tenga en cuenta que soy un Java-phite {¿nueva palabra?} en formación. ;-)- Edward J. Beckett

es legal, pero debe convertirlo en byte explícitamente, es decir, (byte) 0xff porque está fuera de rango.

contestado el 03 de mayo de 12 a las 12:05

Literalmente, puede configurar un byte, pero sorprendentemente, debe usar más dígitos:

byte bad = 0xff; // doesn't work
byte b = 0xffffffff; // fine

La lógica es que 0xff es implícitamente 0x000000ff, lo que excede el rango de un byte. (255)

No es la primera idea que se te ocurre, pero tiene algo de lógica. El número más largo es un número más pequeño (y un valor absoluto más pequeño).

byte b = 0xffffffff; // -1 
byte c = 0xffffff81; // -127 
byte c = 0xffffff80; // -128

contestado el 03 de mayo de 12 a las 21:05

Los valores posibles para un byte rango de -128 a 127.

Sería posible dejar que los valores fuera del rango se asignen a la variable y descartar silenciosamente el desbordamiento, pero eso sería más confuso que conveniente.

Entonces tendríamos:

byte b = 128;
if (b < 0) {
  // yes, the value magically changed from 128 to -128...
}

En la mayoría de las situaciones, es mejor que el compilador le diga que el valor está fuera del rango que "arreglarlo" así.

contestado el 03 de mayo de 12 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.