Java en realidad no tiene primitivas sin signo.
El valor 127 está representado en realidad por '01111111', siendo el primer bit el signo (0 es positivo).
Un byte sin signo podría contener valores de 0 a 255, pero 127 es el máximo para un byte con signo. Como un byte tiene 8 bits, y el firmado consume uno para mantener el signo. Entonces, si quiere representar valores mayores a 127, necesita usar un tipo más grande que tenga una mayor cantidad de bits. El tipo mayor también tiene un bit reservado para el signo, pero tiene al menos 8 bits para los valores reales, por lo que puede representar el valor 255.
Habiendo dicho esto, probablemente debería evitar el uso de bytes y abreviaturas porque existen son problemas con ellos. Notarás que lanzo el resultado a corto, ya que los operadores realmente devuelven int. Deberías mantenerte en int y long in java ya que se implementan mejor.
Editar: el operador AND lo hace sin signo ya que el bit de signo es el primer bit del short, y copia los 8 bits que contienen el valor del byte a los últimos 8 bits del short. Entonces, si tienes un número negativo, el primer bit que es 1 (eso significa que es negativo) en realidad se convierte en parte del valor. Y el corto siempre será positivo ya que su bit de signo está a dos niveles de una potencia de dos para verse afectado por el corto.
byte: 10101101
||||||| <- actual value
short: 0000000010101101
||||||||||||||| <- actual value
Edición 2: Tome en cuenta sin embargo que, dado que los valores negativos utilizan two's complement representation el valor no puede ser lo que esperas. todos los valores positivos siguen siendo los mismos.
Pero -128 = 0x10000000 se convertirá en 128
-127 = 0x10000001 se convertirá en 129
y así sucesivamente hasta -1 = 0x11111111, que se convertirán en 255
¿Algún enlace para los problemas sobre byte y short? He usado byte de vez en cuando, pero nunca he usado short. –
@DeanJ: Creo que el problema es el rendimiento, ya que necesita más lanzamientos porque muchas operaciones devuelven int. – Cloudanger
El primer ejemplo aquí demuestra el punto: http: //blog.mpathirage.com/2010/06/27/java-puzzlers-phantom-reference-threat-attack-of-the-clone-revenge-of-the-shift/Si utiliza cualquier operador en el corto como + o - en realidad se transforma en un int y que puede causar problemas al llamar a métodos sobrecargados. –