我正在使用一个库,该库返回一个带有时间戳的结构,该时间戳由两个(TimestampHi,TimestampLo)unsigned long
表示。我几乎只需要在printf中打印出%llu
的时间戳。
从这两个整数中获取数据并将其正确用作uint64_t的最简单方法是什么?
答案 0 :(得分:10)
假设unsigned long long
是您平台上的64位类型
assert(sizeof(unsigned long) * CHAR_BIT == 32);
assert(sizeof(unsigned long long) * CHAR_BIT == 64);
// Static asserts are more appropriate in cases like this
unsigned long long Timestamp = TimestampHi;
Timestamp <<= 32; Timestamp += TimestampLo;
然后打印Timestamp
值。
与单线
相同unsigned long long Timestamp = ((unsigned long long) TimestampHi << 32) + TimestampLo;
或只是
printf("%llu\n", ((unsigned long long) TimestampHi << 32) + TimestampLo);
如果您希望从基于位的操作中抽象代码,可以将表达式重写为
TimestampHi * ((unsigned long long) ULONG_MAX + 1) + TimestampLo
答案 1 :(得分:4)
unsigned long long t = (unsigned long long)hi << 32 | lo;
printf("%ull\n", t);
请注意,我使用unsigned long long
代替uint64_t
,因为它是
printf
轻松打印 - 您不需要PRIu64宏和%ull
。但是,如果你想支持MSVC(这远远不符合现代标准),你可能会更好:
uint64_t t = (uint64_t)hi << 32 | lo;
printf("%" PRIu64 "\n", t);
通过这种方式,您可以确保(通过替换丢失的系统标头)uint64_t
被正确定义为MSVC的64位无符号类型,PRIu64
被定义为正确的printf
格式说明符打印它。
答案 2 :(得分:1)
如果您有某些 64位类型,安德烈会回答您的所作所为,但也许您只有32位类型。在这种情况下,您需要的是一个多精度整数库。 GNU MP library非常好,但对于您的目的可能有点过分。 I8lib实现“双精度”整数运算(即不超过64位),可能你没问题,但我从未使用它。
答案 3 :(得分:0)
如果答案小于2 ^ 49,并且64位整数不可用,那么printf(“%1.0f”,4294967296.0 * upper_part + lower_part)怎么样?这在双重小于64位的平台上不起作用,但它可以在没有64位整数的许多平台上运行。