为什么在将十六进制数字打印为带有前导零的8位数字时,%#08X
不显示与0x%08X
相同的结果
当我尝试使用前者时,08
格式化标志被移除,并且它不仅仅适用于8
。
发布于 2013-02-07 00:24:44
#
部件在输出字符串中给出一个0x
。0
和x
计入08
部件中列出的"8“字符。如果你想让它是相同的,你需要10个字符。
int i = 7;
printf("%#010x\n", i); // gives 0x00000007
printf("0x%08x\n", i); // gives 0x00000007
printf("%#08x\n", i); // gives 0x000007
更改x
的大小写也会影响输出字符的大小写。
printf("%04x", 4779); // gives 12ab
printf("%04X", 4779); // gives 12AB
发布于 2013-02-07 00:25:23
"0x“计入八字符数。你需要"%#010x"
。
请注意,#
不会将0x附加到0-结果将是0000000000
-所以您可能实际上应该使用"0x%08x"
。
发布于 2021-04-27 20:26:27
#
会使0x
(或%#X
的0X
)优先于输出,除非值为0
,因此如果希望0x
始终出现在输出中,则不应使用#
。
您可以结合使用width字段和0
标志来生成前导零:%08x
将带有前导零的数字填充到宽度8
。如果希望所有32位值的输出一致,请使用"0x08x"
。
您还可以使用精度字段:%.8x
将带有前导零的数字填充到8
位数的总和。因此,您也可以使用"0x%.8x"
来实现您的目的。
如果前缀是作为转换的一部分生成的,则这些转换规范会有所不同,例如#
的0x
或有符号转换中的负数的-
,其长度计入宽度,而不计入精度说明符。此外,精度字段可以与宽度字段组合:
printf("|%10x|", 256) // outputs | 100|
printf("|%010x|", 256) // outputs |0000000100|
printf("|%#010x|", 256) // outputs |0x00000100|
printf("|%10.8x|", 256) // outputs | 00000100|
printf("|%#10.8x|", 256) // outputs |0x00000100|
printf("|0x%.8x|", 256) // outputs |0x00000100|
printf("|%10x|", 0) // outputs | 0|
printf("|%010x|", 0) // outputs |0000000000|
printf("|%#010x|", 0) // outputs |0000000000|
printf("|%10.8x|", 0) // outputs | 00000000|
printf("|%#10.8x|", 0) // outputs | 00000000|
printf("|0x%.8x|", 0) // outputs |0x00000000|
我推荐使用最后一个:"0x%.8x"
。
https://stackoverflow.com/questions/14733761
复制相似问题