当处理int32_t、uint16_t和int8_t等类型时,printf要使用什么格式说明符?
使用%d、%i等会导致程序不可移植。使用PRIxx宏是最佳方法吗?
当处理int32_t、uint16_t和int8_t等类型时,printf要使用什么格式说明符?
使用%d、%i等会导致程序不可移植。使用PRIxx宏是最佳方法吗?
使用PRIxx宏是最好的方法吗?
据我所知,是的。
编辑:另一种解决方案是将其强制转换为至少与要打印的类型一样宽的类型。例如,int
至少有2个字节宽度,可以使用 printf("%d\n", (int)some_var)
打印一个 int16_t
。
如果你正在使用新类型,那么你应该使用新的格式说明符。
这是最好的方法,因为实现已经完成了确保格式字符串对于类型正确的繁重工作。
所以,例如:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main (void) {
int32_t i32 = 40000;
printf ("%d\n", i32); // might work.
printf ("%" PRId32 "\n", i32); // will work.
return 0;
}
展示了两种做法。
然而,实际上第一种方法并不能保证按照你的期望执行。例如,在一个使用16位int
类型的系统上,你可能会得到不同的值。