When using mathematical operations, the result is always the larger of the two operands, but never smaller than int. So int + int = int, int + long = long, char + int = int, char + char = int. The only way to break this is by using the +=, -= etc operators. This forces the right hand side to be cast to the same type as the left hand side.
So c += i is short hand for c = (char)(c + i) but c = c + i will fail because the result of c + i is an integer and you cannot assign an integer to a char variable without explicit casting.