3

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

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

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

宽度

width 参数 ... 控制输出的最小字符数。如果输出值中的字符数小于指定宽度,则添加空格 ... 。如果宽度以 0 为前缀,则添加前导零 ... 。

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

精度

...它由一个句点 (.) 后跟一个非负十进制整数组成,根据转换类型,它指定...要输出的有效位数。

类型确定精度的解释或省略精度时的默认精度......

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

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

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

4

1 回答 1

4

你是对的:

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

是等价的。

至于为什么- 参考这个:

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

因此:

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

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

因此:

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

并从此参考:

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

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

最后:

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

%0.15X

这很重要

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

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

更新:

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

于 2013-03-11T07:17:21.980 回答