C 如何找到uint\u fast32\t的宽度
我希望能够移植C 如何找到uint\u fast32\t的宽度,c,printf,stdint,C,Printf,Stdint,我希望能够移植fprintf()auint\u fast32\t,如stdint.h中所定义,并使用所有前导零。例如,如果我的平台将uint\u fast32\t定义为64位无符号整数,我希望fprintf()使用类似%016lX的格式说明符,但如果它是32位无符号整数,我希望使用%08lX 有没有像INTFAST32_BITS这样的宏我可以使用 现在我正在使用 #if UINT_FAST32_MAX == 0xFFFFFFFF # define FORMAT "08"PRIXFAST32
fprintf()
auint\u fast32\t
,如stdint.h
中所定义,并使用所有前导零。例如,如果我的平台将uint\u 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\u fast32\t
,而且代码也有点笨重且难以阅读您可以通过与查找任何其他类型的大小相同的方式找到uint\u fast32\t
的大小:对其应用sizeof
运算符。结果的单位是类型char
的大小。例如:
size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);
但这不足以打印带有printf
-系列函数之一的文件。如果任何格式化指令与相应参数的类型不匹配,并且uint\u fast32\t
的大小不足以进行适当匹配,则在printf
等中会出现未定义的行为
这就是中已经描述的格式化宏的作用。为每种类型和转换提供适当的大小修饰符和转换字母。对于uint\u fast32\u t
的X
转换,相应的宏为PRIXFAST32
您可以正常提供任何标志、字段宽度和精度。如果确实希望使用与uint\u fast32\u t
的实际大小相适应的字段宽度,那么一种合理的方法是使用选项指定字段宽度作为参数传递(类型int
)。因此:
然而,我注意到,这似乎有点可疑,因为您正在为比一般情况下更广泛的值设置准备金,您应该允许该类型的任何值变为。
printf
函数在任何情况下打印的数字都不会少于表示值所需的数字,假设它确实是指定的类型,因此我倾向于简单地使用一个固定的字段宽度,该字段宽度足以容纳32位整数(比如8)。您可以保证您的uint\u fast32\u t
将具有“至少具有指定的宽度”
。因此您可以保证32位。为什么这不能满足您的限制。它可以是32位或64位,但不能更小。@DavidC.Rankin他们可能希望将其推广到一个假设的uint48\t
或uint128\t
。Re“…提供比您应该允许的任何类型的值更宽的值”:不一定。例如,为多精度算法编写代码是合理的,该算法至少需要32位单元,但适用于实现提供的任何更大的单元。
uint_fast32_t fast;
// ...
printf("%0*" PRIXFAST32 "\n", (int) sizeof(fast) * 2, fast);