如何将64位整数打印成十六进制?

60

使用以下代码,我试图使用printf()输出unit64_t变量的值。 使用gcc编译代码会返回以下警告:

  

警告:格式“%x”需要类型为“unsigned int”的参数,   但参数2的类型为“uint64_t” [-Wformat =]

代码:

#include <stdio.h>
#include <stdint.h>

int main ()
{
    uint64_t val = 0x1234567890abcdef;
    printf("val = 0x%x\n", val);

    return 0;
}

输出:

val = 0x90abcdef

期望的输出:

val = 0x1234567890abcdef

如何使用printf()输出一个64位值的十六进制整数?在这种情况下,x转换说明符似乎是错误的。


3
请使用<inttypes.h>头文件中的PRIx64宏,即可打印int64_t类型的值。 - M Oehm
2
使用 printf("val = %#018"PRIx64"\n", val); 来打印前导零。别忘了 #include <inttypes.h> - Daniel
2个回答

89
你的编译器警告你,格式说明符与传递给它的数据类型不匹配。
尝试使用 `%lx` 或 `%llx`。为了更好的可移植性,请包含 `inttypes.h` 并使用 `PRIx64` 宏。
例如: `printf("val = 0x%" PRIx64 "\n", val);` (注意这是字符串连接)。

5
%016llx 可以用来确保输出带有 填充零(在开头),以达到最少字段宽度为 16 个字符。 - Top-Master
1
为什么 0000000000000000 前面没有 0x - user2023370
3
记录一下,PRIx64被定义为"ll" "x" - Welgriv
1
@Welgriv 在哪个平台和编译器上呢?不能保证所有平台都将宏定义为"ll" "x",这也是宏的全部意义所在。 - tangrs
1
PRIX64 也可以工作,并打印大写字母(A-F),而非小写字母。 - swineone
显示剩余3条评论

13
#include <inttypes.h>

编辑:使用printf("val = 0x%" PRIx64 "\n",val);代替。

尝试printf("val = 0x%llx\n",val);。请参阅printf manpage

ll(ell-ell)。以下整数转换对应于long long int或unsigned long long int参数,或以下n转换对应于指向long long int参数的指针。

编辑:就像@M_Oehm写的那样更好:有一个特定的宏,因为unit64_t并不总是unsigned long longPRIx64另请参见此stackoverflow答案


我不相信你的编辑是正确的 - 它不是“%PRIx64” - 它是一个字符串连接,其值由宏PRIx64定义。 - David Ljung Madison Stellar
@DavidLjungMadison 您是正确的,已修复。 - Superlokkus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接