【问题标题】:How do I display a 64bit unsigned integer with sprintf?如何使用 sprintf 显示 64 位无符号整数?
【发布时间】: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 打印它,最好是毫秒分辨率?

标签: c stm32 stm32cubeide


【解决方案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 位时,使用 %lluuint64_t 将失败。最好使用"%"PRIu64 打印。
  • 链接函数看起来不对。而不是div_t d = div(v, 10);,我希望lldiv_t d = lldiv(v, 10);。但是当v > LLONG_MAX 时,这仍然不够。希望只使用c = v % 10; 路径。注意:llabs(LLONG_MIN) 是 UB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2011-11-10
  • 2016-06-28
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多