To answer your first question, you get loss of precision errors at both marks 1 and 4 in the following code.
The reason for this is the implicit casting that occurs when you use the assignment operator.
Mark 1 is a widening conversion, so you might expect it to be fine. The issue is that byte (and short) are signed in
Java; char is unsigned, so it is possible to lose information during this conversion.
Mark 4 has a slightly different issue. The result of multiplying a char will be an int. Trying to assign the result to a short is a narrowing cast.