我最近偶然发现了这样的代码:

uint32_t val;
...
printf("%.08X", val);

这让我感到困惑。我的意思是,要么指定0 + width要么指定精度,两者的意义何在?

Width:



Precision:



所以我要么使用"%08X"要么"%.8X",但是"%.08X"对我来说没有任何意义。

但是似乎并没有什么区别,也就是说,所有三个变体似乎都产生相同的输出。

最佳答案

你是对的:
"%08X""%.8X""%.08X"
是等效的。

至于原因-请引用:

http://www.cplusplus.com/reference/cstdio/printf/

因此:

在情况1中,此使用指定宽度:



因此:
%08X将至少打印8个字符

并从此引用:


%.8X使用精度说明符。因此,它也将至少打印8个字符。

最后:
%.08X也将至少打印8个字符(同样,由于精度说明符)。为什么?因为08被解释为8-导致与前一个输出相同。对于单位精度的规格输出,这似乎没有意义,但在这种情况下:
%0.15X
这很重要。

存在这些不同的格式,可以更好地控制输出(在我看来,这是一个很像Fortran的结转)。

但是,正如您所发现的那样,这种对精确度进行更好控制的过度补偿使您可以获得相同的输出-但带有不同的标志。

更新:

正如hvd所指出的,我已经忘记提及:X说明符需要一个无符号值,因此在这种情况下,%08X%.8X的输出是相同的(由于没有符号)。但是,对于诸如%08d%.8d-之类的东西,它不是这样的:一个填充8位数字,另一个填充8个字符,因此它们对于负值表现不同。

10-08 10:48