使用printf跨平台打印64位整数

时间:2011-06-09 20:49:19

标签: c printf

在Windows中,它是“%I64d”。在Linux和Solaris中,它是“%lld” 如果我想编写打印printfs值的跨平台long long:这样做的好方法是什么?

long long ll;
printf(???, ll);

4 个答案:

答案 0 :(得分:39)

有几种方法。

您可以用符合C99的方式编写代码,然后在编译器编写器让您失望时提供特定于系统的黑客攻击。 (可悲的是,这在C99中很常见。)

#include <stdint.h>
#include <inttypes.h>

printf("My value is %10" PRId64 "\n", some_64_bit_expression);

如果您的某个目标系统忽略了实现<inttypes.h>或者以某种其他方式恶作剧,因为某些类型功能是可选的,那么您只需要一个系统特定的#define该系统PRId64(或其他)。

另一种方法是选择当前始终实现为64位且由printf支持然后进行强制转换的内容。不完美但通常会这样做:

printf("My value is %10lld\n", (long long)some_64_bit_expression);

答案 1 :(得分:2)

MSVC支持long longll Visual Studio 2005

您可以检查_MSC_VER macro(2005年为>= 1400)的值,或者只是不支持较旧的编译器。

它不提供C99宏,因此您必须转换为long long而不是使用PRId64

如果您使用较旧的MSVC库和非MSVC编译器,这将无济于事(我认为mingw至少提供了支持ll的自己版本的printf)

答案 2 :(得分:1)

在linux和solaris上没有,对于64位类型,这只是lld。 C99规定了简单(但丑陋)的宏来使这些东西可移植PRId64。不幸的是,由于某些Windows编译器不遵循标准,您可能会运气不好。

编辑:在您的示例中,您使用的是64位整数以外的其他内容,即long long。在一些架构上,这可能是128。这里C99有typedef个,可以保证类型的最小或精确宽度(如果它们在平台上实现)。这些类型与inttypes.h标头一起找到,即int64_t,用于以二进制补码表示的固定宽度64位类型。也许或许不是你的Windows编译器有这个。

答案 3 :(得分:0)

作为替代方案,您可以使用以下代码:

uint64_t currentTimeMs = ...;

printf("currentTimeMs = 0x%08x%08x\n",
            (uint32_t)(currentTimeMs >> 32),
            (uint32_t)(currentTimeMs & 0xFFFFFFFF)
    );

或者也许:

printf("currentTimeMs = %u%09u\n",
            (uint32_t)(currentTimeMs / 1000000000),
            (uint32_t)(currentTimeMs % 1000000000)
    );