¿El byte no es complemento a dos con signo?
Frecuentes
Visto 2,549 veces
2
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.
5 Respuestas
4
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
4
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
1
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
1
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
0
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 java primitive or haz tu propia pregunta.
Gracias es bueno saber que la implementación es complemento a dos. Entonces, ¿por qué el lenguaje permite 0xffff_ffff para int? - Sridhar