【问题标题】:printf format for unsigned __int64 on WindowsWindows 上无符号 __int64 的 printf 格式
【发布时间】:2023-03-11 03:37:01
【问题描述】:

我需要打印一个ULONGLONG 值(unsigned __int64)。我应该在printf 中使用什么格式? 我在另一个问题中找到了%llu,但他们说它仅适用于 linux。

感谢您的帮助。

【问题讨论】:

  • 你可以使用 std::cout 吗?它应该可以工作。
  • 我不能。我使用的函数是一个带有变量参数列表的包装器,它使用 printf 并且我无法修改。
  • %llu 不仅适用于 Linux;它是 ISO C 标准定义的格式,从 1999 年版本开始。不幸的是,微软的 C 实现不支持 C99 或更高版本。换句话说,是 Windows,而不是 Linux,这是特例。

标签: c++ c windows printf unsigned


【解决方案1】:

Printf 对unsigned long long 有不同的格式说明符,具体取决于编译器,我见过%llu%Lu。一般来说,我建议您使用 std::cout 和类似的代替。

【讨论】:

  • 问题被标记为“c”和“c++”。在 C 中,std::cout 只不过是语法错误。
【解决方案2】:

使用 Google 搜索“Visual Studio printf unsigned __int64”会产生this page 作为第一个结果,这表示您可以使用前缀I64,因此格式说明符将是%I64u

【讨论】:

  • 其他选择是inttypes.h中定义的宏PRIu64
  • @GrijeshChauhan: PRIu64inttypes.h 在 Visual Studio 中不受支持(至少,Microsoft 不支持)。
  • 请注意,__int64%I64u 都特定于 Visual Studio,因此您的代码将无法移植到任何其他实现。
  • 这不在计划中:P
  • 实际上...使用 Google 搜索“Visual Studio printf unsigned __int64”会产生 THIS 页面作为第一个结果。也许删除 Google 羞辱以确保您的答案不会过时?
【解决方案3】:

%llu 是打印unsigned long long 的标准方式,它不仅适用于 Linux,实际上是在 C99 中。所以问题实际上是使用与 C99 兼容的编译器,即不是 Visual Studio。

C99 7.19.6 格式化输入/输出函数

ll(ell-ell) 指定后面的 d、i、o、u、x 或 X 转换说明符适用于 long long int 或 unsigned long long int 参数;或者后面的 n 转换说明符适用于指向 long int 参数的指针。

【讨论】:

  • 如果我可以选择我正在使用的软件,我不会为此烦恼。
  • 不幸的是,Microsoft 没有将ULONGLONG 定义为unsigned long long。根据this page,它是一个unsigned __int64。使用unsigned long long 的格式可能有效,也可能无效,但是,如果您希望您的代码能够在编译器更新和未来迁移中继续存在,您应该遵守该类型的规范。
  • @Virus721 你的问题是说你需要在 Windows 中使用它,而不是说 Visual Studio。
  • @YuHao: ULONGLONG__int64 是 Visual Studio 中的类型。
  • @EricPostpischil 不知道这一点,对此感到抱歉。但我认为仍然值得指出%llu 不仅仅是Linux。不遵循 C99 是微软的错。
【解决方案4】:

我建议您使用标准 C 库中指定的PRIu64 格式。它旨在为用户提供跨不同架构的无符号 64 位整数的格式说明符。

这是一个例子(用 C 语言,不是 C++):

#include <stdint.h>   /* For uint64_t */
#include <inttypes.h> /* For PRIu64 */
#include <stdio.h>    /* For printf */
#include <stdlib.h>   /* For exit status */

int main()
{
    uint64_t n = 1986;
    printf("And the winning number is.... %" PRIu64 "!\n", n);
    return EXIT_SUCCESS;
}

【讨论】:

  • Visual Studio 不支持stdint.hinttypes.h。不支持C 1999。有third-party implementations of them
  • @EricPostpischil:微软的员工完全失去理智了吗? :(
  • 感谢您的帮助,但 %I64d 完成了这项工作。
  • @VladLazarenko:微软对赚钱更感兴趣,而不是遵守 ISO 标准。显然,到目前为止,他们已经决定,C99 支持不值得所需的投资。我也不喜欢它(它减缓了 C99 的普遍采用,更不用说 C11),但我无法判断他们的决定在他们做出决定的背景下是否正确。就此而言,他们没有义务支持 C99 或完全支持 C。 (写了多少个 C 编译器?)
  • @KeithThompson:完全同意你的观点。微软不拥有我们任何东西。我只是希望有这样一个资源和影响力的公司能为社会和程序员做更多的好事。到目前为止,他们只是制造了不一致:)
【解决方案5】:

这是 HEX 输出的解决方法

printf("%08X%08X", static_cast<UINT32>((u64>>32)&0xFFFFFFFF), static_cast<UINT32>(u64)&0xFFFFFFFF));

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2014-01-21
    • 2020-10-07
    相关资源
    最近更新 更多