2015-04-30 32 views
0

下面的代码打印为1030432081(这是错误的)编译时使用gcc -m32 time.c,而编译时没有-m32标志时它工作正常。有什么办法可以让这个工作?如何使用uint64_t和-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(); 
} 
+0

'(uint64_t)1000000' –

+0

解决了这个问题。你能解释为什么吗? (如果你愿意,可以将它作为答案) – ben

回答

1

如果整型常量适合,则其类型为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位的结果。

+0

不,整型常量的类型可以是'int','unsigned int','long int','unsigned long int','long long int'或'unsigned long long int',取决于它的值,它是十进制还是八进制还是十六进制,以及它是否有后缀('U','L','UL','LL','ULL')。特别是,如果* INT_MAX> = 1000000,'1000000'的类型为'int' *。如果“int”是16位,它将是'long int'类型。详情请参阅[N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.4.4.1。 –