uint32_t和size_t的printf格式说明符

时间:2010-07-02 18:37:16

标签: c printf

我有以下

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 个答案:

答案 0 :(得分:125)

尝试

#include <inttypes.h>
...

printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);

z表示长度与size_t相同的整数,PRIu32defined in the C99 header inttypes.h表示无符号的32位整数。

答案 1 :(得分:23)

所需要的只是格式说明符和类型一致,你总是可以强制转换为真。 long至少为32位,因此%lu(unsigned long)k始终是正确的:

uint32_t k;
printf("%lu\n", (unsigned long)k);

size_t比较棘手,这就是在C99中添加%zu的原因。如果你不能使用它,那就像k一样对待它(long是C89中最大的类型,size_t不太可能更大)。

size_t sz;
printf("%zu\n", sz);  /* C99 version */
printf("%lu\n", (unsigned long)sz);  /* common C89 version */

如果没有为您传递的类型提供正确的格式说明符,那么printf将相当于从数组中读取太多或太少的内存。只要您使用显式强制转换来匹配类型,它就是可移植的。

答案 2 :(得分:21)

当它实际上是size_t(32位)时,听起来好像你期望unsigned longunsigned int(可能是64位)相同。在这两种情况下都尝试使用%zu

虽然我不完全确定。

答案 3 :(得分:16)

如果您不想使用PRI *宏,则另一种打印 ANY 整数类型的方法是强制转换为intmax_tuintmax_t并使用{{1分别是}或"%jd"。这对于没有定义PRI *宏的POSIX(或其他OS)类型特别有用,例如%ju