gpt4 book ai didi

c - 为什么 PRIx64 打印 "lx"而不是 16 个十六进制字符?

转载 作者:行者123 更新时间:2023-12-03 07:50:10 32 4
gpt4 key购买 nike

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

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 可移植类型定义在此平台上的行为不符合预期?

最佳答案

newlib-nano 不支持 float (需要告诉链接器链接支持)并且 printf 不支持 long long 数字(并且没有添加支持的方式)。

如果您想打印 long long 数字,则不得使用 nano.specs

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打印函数。

一般说明:当您对微 Controller 进行编程时,您应该忘记在对大型机器(例如 PC 计算机)进行编程时通常使用的许多东西,尤其是 malloc 样式分配和花哨的 printf 格式。

关于c - 为什么 PRIx64 打印 "lx"而不是 16 个十六进制字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77391097/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com