2015-04-30 62 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。 –