2014-10-14 3 views
4

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

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

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

С uint8_t и uint16_t использования в том же формате спецификатор %u, как делает printf() «знать», сколько байт для обработки? Или есть какой-то неявный листинг для uint16_t, связанный при поставке uint8_t?

Возможно, мне не хватает чего-то очевидного.

+0

@PaulRoub: Этот вопрос на самом деле является именно тем, о чем мотивировали мои вопросы, спасибо. Я пропустил использование «целых рекламных акций» в качестве ключевого слова поиска. –

ответ

3

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

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

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

+0

Это продвижение также происходит для невариантных функций. –

+4

@BasileStarynkevitch Нет, нет. – 2501

+2

Это также случается для не-прототипированных функций, если это то, к чему стремится Базиле. – mafso

5

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

+1

Вы имеете в виду% hhu? Я думаю, что модификатор длины имеет префикс, а не постфикс. – Bram

+0

@Bram: спасибо. Исправлена. – wick

Смежные вопросы