Я думаю, что вы путаете две вещи. Повышение - это процесс, посредством которого значения целочисленного типа "меньший", чем int / unsigned int, преобразуются либо в int, либо в unsigned int. Правила выражены несколько странно (в основном для правильной работы с символами), но убедитесь, что значение и знак сохраняются.
Тогда существует другая концепция обычного арифметического преобразования , при которой операнды арифметических операторов преобразуются в общий тип. Он начинается с преобразования операнда (в int или unsigned), если они относятся к типу, меньшему, чем int, и последующего выбора целевого типа в следующем процессе (для целочисленных типов: 6.3.1.8/1)
Если оба операнда имеют одинаковый тип, дальнейшее преобразование не требуется.
В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеют беззнаковый
целочисленные типы, операнд с типом меньшего целого ранга преобразования
преобразован в тип операнда с большим рангом.
В противном случае, если операнд с целым типом без знака имеет ранг больше или
равен рангу типа другого операнда, то операнд с
целочисленный тип со знаком преобразуется в тип операнда с беззнаковым
целочисленный тип.
В противном случае, если тип операнда со знаком целого типа может представлять
все значения типа операнда с целым типом без знака, то
операнд с целым типом без знака преобразуется в тип
операнд со знаком целого типа.
В противном случае оба операнда преобразуются в целочисленный тип без знака
соответствует типу операнда с целочисленным типом со знаком.
(Обратите внимание, что ISTR, что эти правила немного изменились между C89 и C99)