这比一个重要的问题更有趣,但是为什么在将十六进制打印为带有前导零的8位数字时,为什么%#08X
显示的结果不相同0x%08X
?
当我尝试使用前者时,08
格式设置标记已删除,并且只适用于8
。
再一次,我只是好奇。
这比一个重要的问题更有趣,但是为什么在将十六进制打印为带有前导零的8位数字时,为什么%#08X
显示的结果不相同0x%08X
?
当我尝试使用前者时,08
格式设置标记已删除,并且只适用于8
。
再一次,我只是好奇。
Answers:
该#
部分0x
在输出字符串中给您一个。在0
和x
反对在列出的“8”字计数08
的一部分。如果您希望相同,则需要输入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
14F
?
i = 0;
,版本%#
将不包含0x
前缀。
所述%#08X
转换必须与前面的值0X
; 这是标准要求的。在标准中没有证据表明#
应当改变08
规范部分的行为,除了0X
前缀是长度的一部分(因此,您可能希望/需要使用%#010X
。如果像我一样,您喜欢用十六进制表示为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.1 的
fprintf
功能¶6标志字符及其含义是:
...
#
结果被转换为“替代形式”。...对于x
(或X
)转换,非零结果以0x
(或0X
)为前缀。...
(已添加重点。)
注意,using %#X
将使用大写字母作为十六进制数字并0X
作为前缀;using %#x
将使用小写字母作为十六进制数字并0x
作为前缀。如果您希望将其0x
作为前缀和大写字母,则必须分别编码0x
:0x%X
。当然,可以根据需要添加其他格式修饰符。
对于打印地址,请使用<inttypes.h>
标题,uintptr_t
类型和PRIXPTR
格式宏:
#include <inttypes.h>
#include <stdio.h>
int main(void)
{
void *address = &address; // &address has type void ** but it converts to void *
printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
return 0;
}
输出示例:
Address 0x7FFEE5B29428
根据长度选择毒药-我发现12精度对于运行macOS的Mac上的地址非常适用。结合.
指定最小精度(数字),它可以可靠地格式化地址。如果您将精度设置为16,那么根据我在Mac上的经验,多余的4位数字始终为0,但是在便携式64位代码中肯定需要使用16而不是12(但是对于8位数字,则使用8 32位代码)。
0x%.8X
吗 这将导致零填充。(这0x
只是序言,但您可能已经意识到这一点)。