为零填充宽度和精度与要打印的整型参数相同
Are zero padded width and precision the same for integer arguments to printf?
我最近偶然发现了这样的代码:
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个字符,所以它们对负值的行为不同。
- C 字符串返回字符串的整数/双精度/长整型值
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 如何在逗号后使用 cout 打印整数值,而无需在逗号后添加额外的零C++?
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 将整型常量映射到类型
- 将元组和整型实例合并到引用元组中
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 将最小值整数转换为无符号长整型
- 如何将小端格式的QByteArray转换为无符号长整型
- 直接初始化无符号短整型的标准行为
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 无符号和有符号短整型的位宽
- gdb ptype 打印整数后缀以指示它是有符号的、无符号的、无符号的长整型等
- 在C++中使用幂函数时,可以准确地打印长整型
- 长整型的位表示未正确打印
- 为零填充宽度和精度与要打印的整型参数相同