C:为十六进制计算添加自动前缀

时间:2017-07-04 05:56:35

标签: c

这是我的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,是否可以实现此目的?

2 个答案:

答案 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}}。对于xX转化说明符,非零结果应以0x(或0X)作为前缀。对于aAeEfFgG转换说明符,结果应始终包含基数字符,即使基数字符后面没有数字。如果没有此标志,只有在跟随数字后,才会在这些转换的结果中显示基数字符。对于gG转换说明符,不应像通常那样从结果中删除尾随零。对于其他转换说明符,行为未定义。

前导零

您可以使用手动前缀以各种方式指定位数,而不是始终使用所需的结果。请注意,使用#标志时,前缀将在最小字段宽度中计算。

#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.12X0x%16.16X中的一个。后者通常会留下我打印的地址比我想要的更多前导零。

如果需要,您可以左对齐,依此类推。请参阅已链接的printf()规范,这正式适用于POSIX,但POSIX扩展名已明确标记。

对于打印地址,我使用uintptr_t中的PRIXPTR<inttypes.h>,导致格式字符串沿着以下行:

printf("0x%8.8" PRIXPTR "\n", (uintptr_t)&x);

正如您所看到的,可以使用许多变体 - 您需要选择最适合您的变体。