2012-07-01 57 views
0
#include <ctime> 
#include <cstdio> 
#include <sys/time.h> 
#include <iostream> 
using namespace std; 

int main() { 
    struct timeval tv; 
    gettimeofday(&tv, 0); 
    unsigned long long int var=tv.tv_sec*1000L+tv.tv_usec/1000L; 
    cout<<sizeof(var)<<endl; 
    cout<<var<<endl; 
    printf("%u%-15u\n", (unsigned int)(var/1000000000), (unsigned int)(var%1000000000)); 
    return 0; 
} 

這件事打印我的32位服務器上整數類型大小問題

8 
1341143123970 
1341143123970  

我的64位機器上,但

8 
1113191712 
1113191712  

。第二個結果顯然是固定爲一個32位數字,但在兩種體系結構中,unsigned long long int都是8個字節。那麼夾緊發生在哪裏,爲什麼?

+0

C和C++都不會考慮在決定如何計算時如何使用值。您將值保存在'unsigned long long int'中對計算方式有* no *影響。如果你使用'bool x','foo'的調用將是相同的。 x = foo(y);'或者如果你做'int x; x = foo(y);'或'float x; x = foo(y);'或其他。 –

回答

4

正是由於long寬度不是在您的32位和64位機器是相同的。的類型的tv_sec是算術式,通常1)long

可以確保乘法與64位類型來完成的,通過使用1000ULL代替1000L

unsigned long long int var=tv.tv_sec*1000ULL+tv.tv_usec/1000ULL; 


1)在glibc例如,它是long"In the GNU C library, time_t is equivalent to long int"http://www.gnu.org/software/libc/manual/html_node/Simple-Calendar-Time.html

+0

但'tv_sec'不是'long',而是'time_t'。 – cnicutar

+0

@cnicutar謝謝,更新。 – ouah

+0

我從「timeval」字段已經是64位的錯誤假設開始。順便說一下,整數文字可能的前綴列表在哪裏? –