printf()格式为hex
这是一个比一个重要的问题更好奇的查询,但是为什么当打印hex数字为前导零的8位数字时,是否这样做%#08X
不显示与0x%08X
相同的结果?
当我尝试使用前者时, 08
格式化标志被删除,并且仅用8
就不起作用。
我只是好奇而已。
#
部分在输出string中给你一个0x
。 08
列出的“8”字符相对应的是0
和x
。 如果你想要它是相同的,你需要问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
“0x”指向八个字符的计数。 你需要"%#010x"
。
请注意, #
不会将0x追加到0 – 结果将是0000000000
– 所以您可能实际上应该只使用"0x%08x"
。
%#08X
转换必须在0X
之前; 这是标准所要求的。 在标准中没有证据表明#
应该改变规范的08
部分的行为,除了0X
前缀被计算为长度的一部分(所以你可能需要/需要使用%#010X
。如果像我一样,你喜欢你的hex表示为0x1234CDEF
,那么你必须使用0x%08X
来达到所需的结果,你可以使用%#.8X
,并且还应该插入前导零。
尝试以下代码的变体:
#include <stdio.h> int main(void) { int j = 0; printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j); for (int i = 0; i < 8; i++) { j = (j << 4) | (i + 6); printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j); } return(0); }
在RHEL 5机器上,在Mac OS X(10.7.5)上,输出结果是:
0x00000000 = 00000000 = 00000000 = 0000000000 0x00000006 = 0X000006 = 0X00000006 = 0x00000006 0x00000067 = 0X000067 = 0X00000067 = 0x00000067 0x00000678 = 0X000678 = 0X00000678 = 0x00000678 0x00006789 = 0X006789 = 0X00006789 = 0x00006789 0x0006789A = 0X06789A = 0X0006789A = 0x0006789a 0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab 0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc 0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd
我对0的处理有点惊讶; 我不清楚为什么0X
前缀被省略,但是有两个独立的系统,它必须是标准的。 它证实了我对#
选项的偏见。
零的处理是按照标准进行的。
ISO / IEC 9899:2011§7.21.6.1fprintf 函数
¶6国旗字符及其含义如下:
…
#
结果被转换为“替代forms”。 …对于x
(或X
)转换, 非零结果的前缀为0x
(或0X
)。 …
(强调补充说。)