1) it is giving error as you are assigning byte to char. Although char has a larger size than byte, but it cannot store negative values while byte can. So if byte has a negative value, then assigning it to char will result in a loss of the original value.
2) it is giving compilation error because when you multiply any data type below integer, the result is always an int.
i agree with your explanation about second doubt. in case of first doubt: i declared byte variable as final so i think it is a compile time constant so no casting is required in line1.