为零填充宽度和精度与要打印的整型参数相同

Are zero padded width and precision the same for integer arguments to printf?

本文关键字:打印 整型 参数 填充 精度      更新时间:2023-10-16

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

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

让我很困惑。我的意思是,要么指定0 +宽度,要么指定精度,两者都有什么意义?

宽度:

宽度参数…的最小字符数是输出。如果输出值中的字符数较少超出指定的宽度,将添加空白... .如果宽度前缀到0时,添加前导零... .

宽度规格从不导致值被截断. ...

精度

:

…它由一个句号(.)和一个非负的小数组成整数,根据转换类型指定…的要输出的有效位数。

类型决定精度的解释或省略精度时的默认精度…

d, i, u, o, x, X -精度指定最小的数目要打印的数字。如果参数中的位数较少在精度之外,输出值在左边用零填充。的当位数超过精度时,值不被截断。

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

然而,这似乎没有任何区别,也就是说,所有三个变体似乎产生相同的输出。

你是对的:

"%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,这是要打印的最大字符数。默认为全部字符被打印,直到遇到结束的null字符。如果指定的周期没有为精度指定显式值,则0假定.

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

最后:

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

%0.15X

可以起作用。

这些不同格式的存在是为了更好地控制输出(在我看来,这是一种与Fortran非常相似的继承)。

但是,正如您所发现的,这种对精度的更精细控制的过度补偿允许您获得相同的输出-但是具有不同的标志。

更新:

正如hvd所指出的,我忘记提到的:X说明符需要一个无符号值,所以在这种情况下,%08X%.8X的输出是相同的(由于没有符号)。然而,对于像:%08d%.8d - 这样的东西,它不是:一个填充到8位数字,另一个填充到8个字符,所以它们对负值的行为不同。