如何使用 uint64_t 和 -m32?

How to use uint64_t and -m32?

以下代码在使用 gcc -m32 time.c 编译时打印例如 1030432081(这是错误的),而在不使用 -m32 标志编译时它工作正常。有什么方法可以让它工作吗?

#include <sys/time.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

void test() {
  struct timeval t;  
  gettimeofday(&t, NULL);
  uint64_t microseconds = t.tv_usec + t.tv_sec * 1000000;
  printf("%"PRId64, microseconds);
}

int main() {
  test();
}

整数常量如果适合则为 int 类型。在 32 位和 64 位模式下,1000000 都是这种情况。

因此,在32位模式下,t.tv_usec、t.tv_sec和1000000都是32位,结果也溢出了。只有在计算之后,结果才会转换为64位。

如果您将常量转换为 64 位,则 t.tv_sec 在乘法之前被提升为 64 位,同样地 t.tv_usec 在加法之前被提升为 64 位。实际上,您强制整个计算以 64 位完成。结果是正确的并且已经是 64 位,然后被存储。