The standard does not specify those low-level details but you missed one important part in the draft C11 standrd section 6.5.7
paragraph 2 says (emphasis mine):
The integer promotions are performed on each of the operands.[...]
This is covered in section 6.3.1
Arithmetic operands subsection 6.3.1.1
Boolean, characters, and integers paragraph 2 which says:
The following may be used in an expression wherever an int or unsigned int may
be used:
and includes the following bullet:
An object or expression with an integer type (other than int or unsigned int)
whose integer conversion rank is less than or equal to the rank of int and
unsigned int.
which includes short and char and goes on to say (emphasis mine):
If an int can represent all values of the original type (as restricted by the width, for a
bit-field), the value is converted to an int; otherwise, it is converted to an unsigned
int. These are called the integer promotions.58) All other types are unchanged by the
integer promotions.
So both a
and 6
has to be promoted to int and that will provide a lower bound on which register can be used to store the intermediate results.
Note, as Keith points out in your code sample since the assignment and shift have no observable behavior the compiler would be free to optimize those instructions out.