如何使用 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 位时,使用 %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。

以上是关于如何使用 sprintf 显示 64 位无符号整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个32位整数组合成一个64位整数?

AVX2 64位无符号整数比较

如何在 AVX2 中将 32 位无符号整数转换为 16 位无符号整数?

8位无符号整数点分式版本

如何从 32 位 R 整数中提取 4 位无符号整数?

如何在 C 中提取 32 位无符号整数的特定“n”位?