【问题标题】:Are zero padded width and precision the same for integer arguments to printf?printf 的整数参数的零填充宽度和精度是否相同?
【发布时间】:2013-02-26 07:13:45
【问题描述】:

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

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

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

Width:

宽度参数...控制最小字符数 是输出。如果输出值的字符数少 超过指定的宽度,添加空格...。如果宽度是前缀 由 0 增加前导零 ... .

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

Precision:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你是对的:

    "%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 说明符需要一个无符号值,所以在这种情况下,%08X%.8X 的输出相同(因为没有符号) .但是,对于类似:%08d%.8d - 不是这样:一个填充到 8 个数字,另一个填充到 8 个字符,因此它们对于负值的行为不同。

    【讨论】:

    • 这并没有回答问题为什么它是这样定义的,它只是表明它是。我会对 OP 的问题感兴趣:“……两者有什么意义?”
    • 请注意,虽然%08X%.8X 表示相同的意思,但%08d%.8d 不要:一个填充到8 个数字,另一个填充到8 个字符,因此它们的行为不同对于负值。 X 采用无符号值,因此它永远没有符号。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多