Все, что нужно, - это то, что спецификаторы формата и типы согласуются, и вы всегда можете привести это к действию.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
будет эквивалентно чтению слишком большого или слишком малого объема памяти из массива.Пока вы используете явное приведение типов для сопоставления, оно переносимо.