使用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 long
和ll
启动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) );