如何使用 sprintf 显示 64 位无符号整数?
Posted
技术标签:
【中文标题】如何使用 sprintf 显示 64 位无符号整数?【英文标题】:How do I display a 64bit unsigned integer with sprintf? 【发布时间】:2021-05-15 03:17:15 【问题描述】:我在 putty 控制台上显示 32 位计时器值。计时器包括自我的 stm32wb55 启动以来的微秒时间。使用以下代码,它可以像我想要的那样工作:
uint32_t time_micro32
sprintf((char*)buf,
"Time: %lu \r\n",
(time_micro32));
但是现在,我想用uint64_t time_micro64
以64 位分辨率显示时间。我尝试了很多,但没有任何效果。有人可以帮我吗?我在 STM32CubeIDE 中编程
【问题讨论】:
你为什么要使用微秒分辨率,然后用一些 PC 编程 stdio.h barf 打印它,最好是毫秒分辨率? 【参考方案1】:我在 STM32CubeIDE 中编程
所以您很可能在“nano”版本中使用 newlib - newlib 的较小版本,它不处理打印 64 位变量。
与完整的 newlib 版本(或使用其他 C 标准库)链接,代码将正常工作。搜索您的 gui - 应该有一个选项,例如“使用标准库的 -nano 版本”或“将 -specs=nano.specs 传递给编译器”。取消选中该选项。确保 -lnano
或 -specs=nano.specs
或类似选项未传递给编译器。之后,您可以使用%llu
或"%"PRIu64
。
更喜欢使用snprintf
而不是sprintf
。
还有其他选择吗?
滚动您自己的实现,将 64 位变量转换为字符串 - 编写这样的函数非常简单。然后使用此函数并打印结果字符串。我有such function。
【讨论】:
将运行时库从specs=nano.specs
切换到standard C library
是关键!谢谢!
"之后您可以使用 %llu 或 "%"PRIu64。" --> 今天听起来不错。稍后,当 long long
为 128 位时,使用 %llu
和 uint64_t
将失败。最好使用"%"PRIu64
打印。
链接函数看起来不对。而不是div_t d = div(v, 10);
,我希望lldiv_t d = lldiv(v, 10);
。但是当v > LLONG_MAX
时,这仍然不够。希望只使用c = v % 10;
路径。注意:llabs(LLONG_MIN)
是 UB。以上是关于如何使用 sprintf 显示 64 位无符号整数?的主要内容,如果未能解决你的问题,请参考以下文章