在Windows中,它是“%I64d”。在Linux和Solaris中,它是“%lld”
如果我想编写打印printfs
值的跨平台long long
:这样做的好方法是什么?
long long ll;
printf(???, ll);
答案 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 long
和ll
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)
);