如何使用 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 位,然后被存储。
以下代码在使用 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 位,然后被存储。