Did you know C standard silently promotes integers to larger size, because "its good for you".
Yes, I did.
The rule is actually simple: C can only do integral arithmetic on int and long (if required) types, and not on short or char.
The Standard implies a load-store machine, where any integral data gets loaded into either an int- or long-sized register (sign or zero extending if necessary), then the calculation is done and then the result gets written back to memory (truncating it if necessary).
RAM (usually 8, 16, 32 or 64 bit words) -> CPU (usually 32 or 64 bit words nowadays) -> RAM again (...)
'So, whats the point with chars and shorts, anyway?', you may ask. To save memory space, basically. Char (array) is usually used for storing strings and short for storing numbers in the up to 10000 or so range (e.g. list of indices for a small-ish array).
The same *should* go for floats and doubles, too, but is not required by the standard: floats for storing, doubles for calculations.