对于printf的整数参数,零填充宽度和精度是否相同?

时间:2013-03-11 07:09:47

标签: c++ visual-c++ printf number-formatting

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

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

这对我来说很困惑。我的意思是,指定0 +宽度或指定精度,两者的重点是什么?

Width

  

width参数...控制最小字符数   输出。如果输出值中的字符数较少   比指定的宽度,空白被添加....如果宽度是前缀   加0,前导零加......

     

宽度规范永远不会导致值被截断。 ...

Precision

  

...它由句点(。)后跟非负小数组成   取决于转换类型的整数,指定...   要输出的有效位数。

     

类型决定了精度的解释还是   省略精度时的默认精度...

     

d, i, u, o, x, X - 精度指定最小数量   要打印的数字。如果参数中的位数较少   与精度相比,输出值用零填充在左侧。该   当位数超过精度时,不会截断值。

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

但它看起来并没有任何区别,也就是说,所有三种变体似乎都会产生相同的输出。

1 个答案:

答案 0 :(得分:3)

你是对的:

"%08X""%.8X""%.08X"

是等效的。

至于为什么 - 请参阅:

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

因此:

在案例1中,这个使用指定宽度:

  

要打印的最小字符数。如果要打印的值   比这个数字短,结果用空格填充。   即使结果较大,也不会截断该值。

因此:

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

并从此参考文献:

  

对于整数说明符(d,i,o,u,x,X):precision指定   要写入的最小位数。如果要写的值是   比这个数字短,结果用前导零填充。该   即使结果更长,也不会截断值。精度为0   表示没有为值0写入字符。对于a,A,e,E,f   和F说明符:这是在之后要打印的位数   小数点(默认情况下,这是6)。对于g和G说明符:这是   要打印的最大有效位数。对于s:这是   要打印的最大字符数。默认情况下全部   打印字符,直到遇到结束空字符。   如果指定的句点没有显式的精度值,则为0   假定。

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

最后:

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

%0.15X

可以重要。

存在这些不同的格式以便更好地控制输出(在我看来 - 这是一个类似于Fortran的结转)。

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

更新:

正如hvd指出的那样,我忘记提及:X说明符需要无符号值,因此在这种情况下,%08X%.8X的输出相同(到期)没有迹象)。但是,对于类似:%08d%.8d - 的内容,它不是:一个填充到8个数字,另一个填充到8个字符,因此它们对负值表现不同。