So known fact: (byte)1 ^ (byte)1 results in an int (per the spec).
Can someone explain to me why the following is possible without explicit cast (from int to byte)? byte myByte = (byte)1 ^ (byte)1
The following, on the other hand, is not allowed:
int i = 0; byte b = i;

This:
(byte)1 ^ (byte)1
is a constant expression (JLS 15.28), which is known to be in the range of byte. You can therefore implicitly convert it to byte in an assignment context (JLS 5.2):
In addition, if the expression is a constant expression (ยง15.28) of type
byte,short,char, orint:
- A narrowing primitive conversion may be used if the type of the variable is
byte,short, orchar, and the value of the constant expression is representable in the type of the variable.
If it weren't a constant expression (e.g. if one of those values were a variable instead) then the assignment would fail.
See more on this question at Stackoverflow