这是我的C程序
#include <stdio.h>
void main() {
printf("Diff = %x\n",0xffffffff-0xfffffffa);
}
标准输出就像这样
C:\Codes>prog.exe
Diff = 5
我想要实现的是将自动前缀0x00000005
自动添加到答案中,以便输出就像这样。
C:\Codes>prog.exe
Diff = 0x00000005
或
C:\Codes>prog.exe
Diff = 0x00000A35
我知道我们可以使用此代码手动执行此操作
#include <stdio.h>
void main() {
printf("Diff = 0x0000000%x\n",0xffffffff-0xfffffffa);
}
但是,如果不在printf中手动编写0x0000000%x
,是否可以实现此目的?
答案 0 :(得分:3)
是的,有可能:
printf("0x%08x\n", 0xffffffff-0xfffffffa);
大多数good beginners books会有一些关于格式化选项的文字。而且总是good references可以阅读。
答案 1 :(得分:2)
有多种方法可以将十六进制前缀添加到输出中:
#include <stdio.h>
int main(void)
{
printf("Diff = %#x\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = 0x%X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#.8x\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#.8X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = 0x%.8X\n", 0xFFFFFFFF - 0xFF012345);
return 0;
}
输出结果为:
Diff = 0xfedcba
Diff = 0XFEDCBA
Diff = 0xFEDCBA
Diff = 0x00fedcba
Diff = 0X00FEDCBA
Diff = 0x00FEDCBA
您可以选择带有小写十六进制数字的0x
小写前缀,或带有大写数字的大写前缀。就个人而言,我喜欢小写前缀和大写数字,所以我总是使用第三个选项。
printf()
的#
标志选择另一种表示形式:
#
- 指定将值转换为替代形式。对于o
转换,它将提高精度,当且仅在必要时,强制结果的第一个数字为零(如果值和精度都是0
,则为0
打印1}}。对于x
或X
转化说明符,非零结果应以0x
(或0X
)作为前缀。对于a
,A
,e
,E
,f
,F
,g
和G
转换说明符,结果应始终包含基数字符,即使基数字符后面没有数字。如果没有此标志,只有在跟随数字后,才会在这些转换的结果中显示基数字符。对于g
和G
转换说明符,不应像通常那样从结果中删除尾随零。对于其他转换说明符,行为未定义。
您可以使用手动前缀以各种方式指定位数,而不是始终使用所需的结果。请注意,使用#
标志时,前缀将在最小字段宽度中计算。
#include <stdio.h>
int main(void)
{
printf("Diff = %#x\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = 0x%X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#.8x\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#.8X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = 0x%.8X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#10x\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#10X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = 0x%10X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#10.10x\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = %#10.10X\n", 0xFFFFFFFF - 0xFF012345);
printf("Diff = 0x%10.10X\n", 0xFFFFFFFF - 0xFF012345);
return 0;
}
输出:
Diff = 0xfedcba
Diff = 0XFEDCBA
Diff = 0xFEDCBA
Diff = 0x00fedcba
Diff = 0X00FEDCBA
Diff = 0x00FEDCBA
Diff = 0xfedcba
Diff = 0XFEDCBA
Diff = 0x FEDCBA
Diff = 0x0000fedcba
Diff = 0X0000FEDCBA
Diff = 0x0000FEDCBA
在32位系统上,我通常使用0x%8.8X
;在64位系统上,我使用0x%12.12X
或0x%16.16X
中的一个。后者通常会留下我打印的地址比我想要的更多前导零。
如果需要,您可以左对齐,依此类推。请参阅已链接的printf()
规范,这正式适用于POSIX,但POSIX扩展名已明确标记。
对于打印地址,我使用uintptr_t
中的PRIXPTR
和<inttypes.h>
,导致格式字符串沿着以下行:
printf("0x%8.8" PRIXPTR "\n", (uintptr_t)&x);
正如您所看到的,可以使用许多变体 - 您需要选择最适合您的变体。