【问题标题】:How to printf a 64-bit integer as hex? [duplicate]如何将 64 位整数打印为十六进制? [复制]
【发布时间】:2015-08-20 07:50:35
【问题描述】:

通过以下代码,我尝试使用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 说明符似乎是错误的。

【问题讨论】:

  • here。基本上,使用来自&lt;inttypes.h&gt;PRIx64 宏。
  • 使用printf("val = %#018"PRIx64"\n", val); 打印前导零。不要忘记#include &lt;inttypes.h&gt;

标签: c gcc 64-bit


【解决方案1】:

来自编译器的警告告诉您格式说明符与您传递给它的数据类型不匹配。

尝试使用%lx%llx。如需更多可移植性,请包含inttypes.h 并使用PRIx64 宏。

例如:printf("val = 0x%" PRIx64 "\n", val);(注意是字符串拼接)

【讨论】:

  • 也可以使用%016llx 来确保输出有padding 零(开头)以达到minimum field width16 个字符
  • 为什么0000000000000000 前面没有0x
  • 为了记录,PRIx64#defined 到 "ll" "x"
  • @Welgriv 在哪个平台和编译器上?无法保证在所有平台上都将宏定义为 "ll" "x",这就是宏的全部意义所在。
  • 是的,但inttypes.h 在任何平台上看起来都一样。至少我在 Win10 (MINGW)、Linux (gcc) 和嵌入环境 (armcc) 上也是如此。
【解决方案2】:

编辑:改用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 另见this stackoverflow answer

【讨论】:

  • 我不相信您的编辑是正确的 - 它不是 "%PRIx64" - 它是一个字符串,其值由宏 PRIx64 定义
  • @DavidLjungMadison 你是对的,修复它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2017-01-23
相关资源
最近更新 更多