Вот: 6.5.16.1 Simple assignment
1 ...
2 In simple assignment (=), the value of the right operand is converted to the type of the
assignment expression and replaces the value stored in the object designated by the left
operand.
6.3.1.3 Signed and unsigned integers
1 When a value with integer type is converted to another integer type other than _Bool, if
the value can be represented by the new type, it is unchanged.
При преобразовании типа значение не меняется, если это возможно.
То есть было 0x01, стало 0x0001, то есть значение единица и до, и после. А если стало 0x0101, то это значение 257, оно другое, и по правилу 6.3.1.3(1) так нельзя.
Одно следствие из этого правила, которое пойдёт вразрез с привычками любителя кодить на ассемблере: при преобразовании из int8_t в int16_t 0xFF превращается в 0xFFFF (то есть -1). При преобразовании из uint8_t в uint16_t 0xFF превращается в 0x00FF, потому что 255.