在预期 PRIu32 的 printf 的格式字符串中使用 %lu 是否有效?
Is it valid to use %lu in a format string for printf where PRIu32 would be expected?
假设我有一个类型为 uint32_t
的变量 i
。预期的打印方式如下:
printf("%"PRIu32"\n", i);
不过需要注意的是,long unsigned int
要求至少32位宽。 long unsigned int
的正确说明符是 %lu
。因此,上面的语句是否可以替换为:
printf("%lu\n", i);
我想是的,因为我看不出为什么不这样做。但是,如果是,那么这将消除这些宏化说明符(如 PRIu32)存在的需要,所以我想我最好问一下。
我问它的原因是我想为 printf
动态创建一个格式字符串,如果我很难为这个格式字符串分配 space不知道字符串 PRIu32
扩展到的大小(以及 sizeof(PRIu32)
是否有效可能值得单独提问)。
无论如何,我想这样写应该是有效的:
printf("%lu\n", (long unsigned)i);
Thus, can the above statement be replaced with:
printf("%lu\n", i);
I’d suppose yes, since I can see no reason why not.
不,因为 long unsigned int
可以 比 32 位大 ,或者如果恰好 32 位可以有与 uint32_t
不同的表示。
In any case, I suppose it should be valid to write:
printf("%lu\n", (long unsigned)i);
是的,正如您观察到的,它也是 安全的,因为需要 long unsigned int
才能表示 uint32_t
的所有值可以带。
假设我有一个类型为 uint32_t
的变量 i
。预期的打印方式如下:
printf("%"PRIu32"\n", i);
不过需要注意的是,long unsigned int
要求至少32位宽。 long unsigned int
的正确说明符是 %lu
。因此,上面的语句是否可以替换为:
printf("%lu\n", i);
我想是的,因为我看不出为什么不这样做。但是,如果是,那么这将消除这些宏化说明符(如 PRIu32)存在的需要,所以我想我最好问一下。
我问它的原因是我想为 printf
动态创建一个格式字符串,如果我很难为这个格式字符串分配 space不知道字符串 PRIu32
扩展到的大小(以及 sizeof(PRIu32)
是否有效可能值得单独提问)。
无论如何,我想这样写应该是有效的:
printf("%lu\n", (long unsigned)i);
Thus, can the above statement be replaced with:
printf("%lu\n", i);
I’d suppose yes, since I can see no reason why not.
不,因为 long unsigned int
可以 比 32 位大 ,或者如果恰好 32 位可以有与 uint32_t
不同的表示。
In any case, I suppose it should be valid to write:
printf("%lu\n", (long unsigned)i);
是的,正如您观察到的,它也是 安全的,因为需要 long unsigned int
才能表示 uint32_t
的所有值可以带。