如何找到 uint_fast32_t 的宽度
How do I find the width of a uint_fast32_t
我希望能够便携地 fprintf()
a uint_fast32_t
如 stdint.h
中定义的所有前导零。例如,如果我的平台将 uint_fast32_t
定义为 64 位无符号整数,我想 fprintf()
使用格式说明符 %016lX
,但如果它是 32 位无符号整数,我想要使用 %08lX
.
有没有像 INTFAST32_BITS
这样的宏我可以使用?
现在我正在使用
#if UINT_FAST32_MAX == 0xFFFFFFFF
# define FORMAT "08"PRIXFAST32
#elif UINT_FAST32_MAX == 0xFFFFFFFFFFFFFFFF
# define FORMAT "016"PRIXFAST32
#endif
但这只适用于正好是 32 或 64 位宽的 uint_fast32_t
,而且代码也有点笨拙且难以阅读
您可以像查找任何其他类型的大小一样查找 uint_fast32_t
的大小:通过对其应用 sizeof
运算符。结果的单位是类型char
的大小。示例:
size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);
但这不足以打印具有 printf
系列函数之一的函数。未定义的行为出现在 printf
等。 al. 如果任何格式化指令与相应参数的类型不匹配,并且 uint_fast32_t
的大小信息不足以进行正确匹配。
这就是 your other answer 中描述的格式化宏的用武之地。它们为每种类型和转换提供了适当的大小修饰符和转换字母。对于 uint_fast32_t
的 X
转换,适当的宏是 PRIXFAST32
.
您照常提供任何标志、字段宽度和精度。如果您确实想使用适合 uint_fast32_t
实际大小的字段宽度,那么一个合理的方法是利用选项来指定字段宽度作为参数传递( int
类型)。因此:
uint_fast32_t fast;
// ...
printf("%0*" PRIXFAST32 "\n", (int) sizeof(fast) * 2, fast);
但是,我注意到这似乎有点可疑,因为您正在为比通常更宽的值做准备,您应该允许该类型的任何值变为。 printf
函数在任何情况下都不会打印比表达该值所需的数字更少的数字,假设它确实是指定的类型,所以我倾向于简单地使用一个固定的字段宽度足以用于 32 位整数(比如 8)。
我希望能够便携地 fprintf()
a uint_fast32_t
如 stdint.h
中定义的所有前导零。例如,如果我的平台将 uint_fast32_t
定义为 64 位无符号整数,我想 fprintf()
使用格式说明符 %016lX
,但如果它是 32 位无符号整数,我想要使用 %08lX
.
有没有像 INTFAST32_BITS
这样的宏我可以使用?
现在我正在使用
#if UINT_FAST32_MAX == 0xFFFFFFFF
# define FORMAT "08"PRIXFAST32
#elif UINT_FAST32_MAX == 0xFFFFFFFFFFFFFFFF
# define FORMAT "016"PRIXFAST32
#endif
但这只适用于正好是 32 或 64 位宽的 uint_fast32_t
,而且代码也有点笨拙且难以阅读
您可以像查找任何其他类型的大小一样查找 uint_fast32_t
的大小:通过对其应用 sizeof
运算符。结果的单位是类型char
的大小。示例:
size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);
但这不足以打印具有 printf
系列函数之一的函数。未定义的行为出现在 printf
等。 al. 如果任何格式化指令与相应参数的类型不匹配,并且 uint_fast32_t
的大小信息不足以进行正确匹配。
这就是 your other answer 中描述的格式化宏的用武之地。它们为每种类型和转换提供了适当的大小修饰符和转换字母。对于 uint_fast32_t
的 X
转换,适当的宏是 PRIXFAST32
.
您照常提供任何标志、字段宽度和精度。如果您确实想使用适合 uint_fast32_t
实际大小的字段宽度,那么一个合理的方法是利用选项来指定字段宽度作为参数传递( int
类型)。因此:
uint_fast32_t fast;
// ...
printf("%0*" PRIXFAST32 "\n", (int) sizeof(fast) * 2, fast);
但是,我注意到这似乎有点可疑,因为您正在为比通常更宽的值做准备,您应该允许该类型的任何值变为。 printf
函数在任何情况下都不会打印比表达该值所需的数字更少的数字,假设它确实是指定的类型,所以我倾向于简单地使用一个固定的字段宽度足以用于 32 位整数(比如 8)。