Types will be promoted, so A=B*C will be equivalent to A=(long)((int)B*C) - so B will be promoted from char to int during the multiplication, and the result promoted to long at the assignment.
Casting is almost ALWAYS wrong - don't do it unless you REALLY know what you're doing. Basically, if you need to ask if you should cast, the answer is NO YOU SHOULDN'T. When you don't need to ask because you know what'll happen, that's when you can. If you need a cast, the chances are that you used the wrong type. There's an example of wrong type use in the above, why are you using a char in a numeric expression? Chars are for character data, nothing else. They are not for storage of numbers from 0-255; use an unsigned short for that.