我最近偶然发现了这样的代码:
uint32_t val;
...
printf("%.08X", val);
这对我来说很困惑。我的意思是,指定0
+宽度或指定精度,两者的重点是什么?
width参数...控制最小字符数 输出。如果输出值中的字符数较少 比指定的宽度,空白被添加....如果宽度是前缀 加0,前导零加......
宽度规范永远不会导致值被截断。 ...
...它由句点(。)后跟非负小数组成 取决于转换类型的整数,指定... 要输出的有效位数。
类型决定了精度的解释还是 省略精度时的默认精度...
d, i, u, o, x, X
- 精度指定最小数量 要打印的数字。如果参数中的位数较少 与精度相比,输出值用零填充在左侧。该 当位数超过精度时,不会截断值。
所以我要么使用"%08X"
或 "%.8X"
,但"%.08X"
对我没有任何意义。
但它看起来并没有任何区别,也就是说,所有三种变体似乎都会产生相同的输出。
答案 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个字符,因此它们对负值表现不同。