are implementations allowed to promote them to unsigned int?
Implementations will promote to unsigned int
if not all unsigned char
values are representable in an int
(as ruled by 6.2.5p9 in C99). See below for implementation examples.
If so, does that imply that an implementation could theoretically have an unsigned char value which is not in the subrange of an int?
Yes, example: DSP cpu with CHAR_BIT
16 or 32.
For example, TI C compiler for TMS320C55x: CHAR_BIT
is 16 and UCHAR_MAX
65535, UINT_MAX
65535 but INT_MAX
32767.