printf()格式为hex

这是一个比一个重要的问题更好奇的查询,但是为什么当打印hex数字为前导零的8位数字时,是否这样做%#08X不显示与0x%08X相同的结果?

当我尝试使用前者时, 08格式化标志被删除,并且仅用8就不起作用。

我只是好奇而已。

#部分在输出string中给你一个0x08列出的“8”字符相对应的是0x 。 如果你想要它是相同的,你需要问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 )。 …

(强调补充说。)