dato - operadores relacionales en java
¿tipo de byte firmado y operadores bit a bit en Java? (1)
citando el byte del sitio web de Oracle: el tipo de datos de bytes es un entero de complemento de dos firmado de 8 bits. Tiene un valor mínimo de -128 y un valor máximo de 127 (incluido) ".
aquí, las dos primeras líneas son válidas pero la última no es
byte b = -128;
byte b1 = 127;
byte b2 = b>>>b1;//illegal
Q1) ¿qué significa exactamente con 8 bits firmado? 128 en formato binario sería 1000 0000 y -128 necesitaría un bit adicional para el signo negativo, donde cabría si todos los 8 bits están ocupados.
Q2) para int, hay un operador de desplazamiento a la derecha sin signo, pero que parece ilegal con bytes, ¿por qué es así. no se puede evitar el desbordamiento en el caso de los bytes. En el caso de int, funciona
Gracias por tu ayuda
Justo lo que parece: hay 8 bits, con 2 ^ 8 = 256 valores posibles. Está firmado, por lo que el rango es frmo -128 a 127 (256 valores). El bit más significativo tiene un valor de -128.
En Java, la promoción numérica binaria se produce con operaciones como
b >>> b1
. Ambos tipos se promocionan aint
, y el resultado es unint
. Sin embargo, puede convertir explícitamente el resultado enbyte
.
Aquí está el elenco:
byte b2 = (byte) (b >>> b1);
El JLS, Sección 5.6.2 , habla sobre la promoción numérica binaria:
La conversión primitiva de ensanche (§5.1.2) se aplica para convertir uno o ambos operandos tal como se especifica en las siguientes reglas:
Si cualquiera de los dos operandos es del tipo double, el otro se convierte a double.
De lo contrario, si alguno de los operandos es de tipo float, el otro se convierte en float.
De lo contrario, si uno de los dos operandos es de tipo largo, el otro se convierte en largo.
De lo contrario, ambos operandos se convierten a tipo int.
(énfasis mío)