Почему спецификатор формата для uint8_t и uint16_t одинаковый (% u)?

Я нашел только довольно несвязанные вопросы из-за множества результатов поиска по запросу printf().

Почему uint8_t не указывает собственную строку формата, а любой другой тип указывает?

Насколько я понимаю printf(), он должен знать длину предоставленных параметров, чтобы иметь возможность анализировать список переменных аргументов.

Поскольку uint8_t и uint16_t используют один и тот же описатель формата %u, как printf() "знает", сколько байтов нужно обработать? Или есть какое-то неявное приведение к uint16_t при поставке uint8_t?

Может быть, я упускаю что-то очевидное.


person Rev    schedule 14.10.2014    source источник
comment
@PaulRoub: Этот вопрос на самом деле именно из-за моей мотивации, спасибо. Я пропустил использование целочисленных продвижений в качестве ключевого слова поиска.   -  person Rev    schedule 14.10.2014


Ответы (2)


printf() - вариативная функция. Его необязательные аргументы (и только они) продвигаются в соответствии с продвижением аргументов по умолчанию (6.5.2.2. P6).

Поскольку вы запрашиваете целые числа, в этом случае применяются целочисленные рекламные акции, а упомянутые вами типы повышаются до int. (а не unsigned int, потому что C)

Если вы используете "%u" в printf () и передаете ему переменную uint16_t, тогда функция преобразует это в int, затем в unsigned int (потому что вы запросили это с помощью% u), а затем печатает.

person 2501    schedule 14.10.2014
comment
Это продвижение также происходит для невариадных функций. - person Basile Starynkevitch; 14.10.2014
comment
@BasileStarynkevitch Нет, это не так. - person 2501; 14.10.2014
comment
Это также происходит с функциями, не являющимися прототипами, на случай, если это то, что Базиль имеет в виду. - person mafso; 14.10.2014

Поскольку% u означает «беззнаковый», он вполне может быть uint64_t и зависит от архитектуры. Согласно man 3 printf, вы можете использовать модификатор длины для получения искомого поведения, то есть% hu (uint16_t) и% hhu (uint8_t).

person wick    schedule 14.10.2014
comment
Вы имеете в виду% hhu? Я думаю, что модификатор длины является префиксом, а не постфиксом. - person Bram; 04.09.2016
comment
@ Брэм: спасибо. Фиксированный. - person wick; 23.10.2017