It's worth noting that arithmetic binary operators (such as + or *) convert their operands to a common type, according to the following precedence:
1. If either operand is not an arithmetic type, no conversion is performed.
2. Else if both operands are of the same type, no conversion is performed.
3. Else if either operand is a double, the other is converted to double.
4. Else if either operand is an unsigned long int, then the other is converted to an unsigned long int.
5. Else if one operand is a long int and the other is an unsigned int, both are converted to unsigned long int.
6. Else if one operand is a long int, (noting that the other must be an int if it has made it to this rule) then the other is converted to a long int.
7. Else if one operand is an unsigned int, then the other is converted to unsigned int.
8. Finally, if this rule is reached, both must be ints, and this is covered in rule 2.
ETA: The calculation is performed, and the result cast to the type of the storage location. Thus, c would be converted to double, because 0.0196 (or whatever) is a double, the result would be a double, and then it would be cast to int to store it in c. That is, of course, if it's ANSI C. Note that the K&R rules are essentially the same, particularly in this regard.
This from Harbison & Steele, second edition.
Note that bitwise logical operators cannot be applied to float or double. These are &, |, ^, ~, >>, and <<, which are bitwise AND, bitwise OR, bitwise XOR, unary ones complement, right shift, and left shift.