如何在C中使用两个32位整数作为64位?

时间:2010-08-13 22:26:09

标签: c linux

我正在使用一个库,该库返回一个带有时间戳的结构,该时间戳由两个(TimestampHi,TimestampLo)unsigned long表示。我几乎只需要在printf中打印出%llu的时间戳。

从这两个整数中获取数据并将其正确用作uint64_t的最简单方法是什么?

4 个答案:

答案 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,因为它是

  1. 保证至少为64位,
  2. 使用printf轻松打印 - 您不需要PRIu64宏和
  3. 您在问题中提到了%ull
  4. 但是,如果你想支持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位整数的许多平台上运行。