спецификаторы формата printf для uint32 t и размера t
у меня есть следующие
size_t i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]n", i, k);
Я получаю следующее предупреждение при компиляции:
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
когда я запустил это с помощью шины я получил следующее:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
большое спасибо за любые советы,
4 ответа:
Похоже, вы ожидаете
size_t
чтобы быть таким же, какunsigned long
(возможно 64 бит), когда это на самом делеunsigned int
(32 бита). Попробуйте использовать%zu
в обоих случаях.Я не совсем уверен, хотя.
попробовать
#include <inttypes.h> ... printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);
The
z
представляет целое число такой же длины, какsize_t
иPRIu32
макрос определено в заголовке C99inttypes.h
, представляет собой 32-разрядное целое число без знака.
все, что нужно, это то, что спецификаторы формата и типы согласуются, и вы всегда можете привести, чтобы сделать это правдой.
long
по крайней мере 32 бита, так что%lu
вместе с(unsigned long)k
всегда правильно:uint32_t k; printf("%lu\n", (unsigned long)k);
size_t
сложнее, поэтому%zu
был добавлен в C99. Если вы не можете использовать это, то относиться к нему так же, какk
(long
самый большой тип в C89,size_t
вряд ли будет больше).size_t sz; printf("%zu\n", sz); /* C99 version */ printf("%lu\n", (unsigned long)sz); /* common C89 version */
если вы не получаете формат спецификаторы корректны для типа, который вы передаете, затем
printf
будет делать эквивалент читаешь слишком много или слишком мало памяти из массива. Пока вы используете явные приведения для сопоставления типов, он переносится.
если вы не хотите использовать макросы PRI*, другой подход для печати любой целочисленный тип должен быть приведен к
intmax_t
илиuintmax_t
и использовать"%jd"
или%ju
, соответственно. Это особенно полезно для типов POSIX (или других ОС), которые не имеют определенных макросов PRI*, напримерoff_t
.