我最近偶然发现了这样的代码:
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个字符,因此它们对于负值表现不同。