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

Der*_*ick 1 c linux

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

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

AnT*_*AnT 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; 
Run Code Online (Sandbox Code Playgroud)

然后打印该Timestamp值.

与单线相同的东西

unsigned long long Timestamp = ((unsigned long long) TimestampHi << 32) + TimestampLo; 
Run Code Online (Sandbox Code Playgroud)

或者干脆

printf("%llu\n", ((unsigned long long) TimestampHi << 32) + TimestampLo);
Run Code Online (Sandbox Code Playgroud)

如果您希望从基于位的操作中抽象代码,则可以将表达式重写为

TimestampHi * ((unsigned long long) ULONG_MAX + 1) + TimestampLo
Run Code Online (Sandbox Code Playgroud)

  • `TimestampHi << 32ull`确实*不*导致`TimestampHi`被提升为`unsigned long long`.移位运算符在这方面略有不同 - 操作数是单独提升的,结果的类型是提升左操作数的类型(在这种情况下,将保持不变).你需要使用`(unsigned long long)TimestampHi << 32`. (3认同)