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;
}

この事は印刷します

8
1341143123970
1341143123970      

私の64ビットマシンでは、

8
1113191712
1113191712      

私の32ビットサーバーで。2番目の結果は明らかに32ビット数にクランプされていますが、unsigned longlongintは両方のアーキテクチャで8バイトです。そのときクランプはどこで起こっているのですか、そしてその理由は何ですか?

4

1 に答える 1

4

これはlong、32ビットマシンと64ビットマシンでの幅が同じではないためです。のタイプtv_secは算術タイプで、通常は1) longです。

1000ULLの代わりにを使用することで、64ビットタイプで乗算が確実に行われるようにすることができます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

于 2012-07-01T11:51:51.657 に答える