为什么 PRIx64 打印“lx”而不是 16 个十六进制字符?

Why does PRIx64 print "lx" instead of 16 hex chars?

提问人:DarkFranX 提问时间:10/31/2023 最后编辑:DarkFranX 更新时间:10/31/2023 访问量:93

问:

我们在工作中遇到了一个问题,即我们无法使用 (PRIx64) 中的“可移植”类型以十六进制格式正确打印 64 位无符号整数。<inttypes.h>

uint64_t serial = 0x12345678;
usb_printf("Serial: %"PRIx64"\n", serial);

哪里

void usb_printf(const char *fmt, ...)
{
    char string[512];
    uint16_t string_length = 0;
    va_list va;

    va_start(va, fmt);
    string_length = vsnprintf(string, ARRAY_SIZE(string), fmt, va);
    bsp_usb_cdc_send_buf((uint8_t *)string, string_length);
    va_end(va);
}

> Serial: lx

它在 LPC55S28 (Cortex-M33) 上运行,并与使用 GCC 链接。-specs=nosys.specs -specs=nano.specs

通过查看 PRIx64 的定义,它似乎被定义为:

#define __INT64 "ll"
#define __PRI64(x) __INT64 __STRINGIFY(x)
#define PRIx64      __PRI64(x)

为什么可移植类型定义在此平台上的行为不如预期?PRIx64

C 十六进制 32 位 Cortex-M UInt64

评论

1赞 pmg 10/31/2023
尝试。。。我的意思是:你可能有库问题,而不是编译器问题printf("%llx\n", 1LLU)
1赞 Andrew Henle 10/31/2023
预处理器的输出是什么样的?你能用源代码编译并查看它扩展成什么吗?gcc -E ...
0赞 pmg 10/31/2023
也许您可以以 32 位块打印?usb_printf("Serial: %"PRIx32"%08"PRIx32"\n", serial>>32, (uint32_t)serial);

答:

5赞 0___________ 10/31/2023 #1

newlib-nano 不支持浮点数(需要告诉链接器链接支持),不支持数字(也无法添加支持)。printflong long

如果你想打印数字,你不能使用nano.specslong long

Nano 文档明确指出

     enable-newlib-io-pos-args
     enable-newlib-io-c99-formats
     enable-newlib-io-long-long
     enable-newlib-io-long-double

不支持生成选项。因此,即使使用这些选项重建库也不会添加支持。

结论:

  1. 不要使用 newlib-nano
  2. 编写自己的打印函数。long long

总则:当你对微控制器进行编程时,你应该忘记许多你在编程大型机器(如PC电脑)时通常使用的东西,尤其是样式分配和花哨的格式。mallocprintf

评论

0赞 DarkFranX 10/31/2023
你能给我指出 newlib-nano 的文档吗?我只能找到 newlib 文档。我可以看到它必须为 newlib 启用,但我找不到 nano 是否支持它。