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

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

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

有几种方法。

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

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

如果你的一个目标系统忽略了实现或者以某种其他方式因为某些类型特性是可选的而被PRId64 ,那么你只需要一个特定于系统的#define用于PRId64 (或其他)那个系统。

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

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

MSVC支持long longll启动Visual Studio 2005 。

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

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

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

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

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

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

 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) );