MIPS 用にコンパイルされたプログラムを実行しているときに、非常に奇妙な問題に遭遇しました。次のコード スニペットは、時間エポックを取得し、マイクロ秒の精度でunsigned long long
変数に格納します。
変数は、私がチェックした8バイトを格納できますsizeof(unsigned long long)
。
このコードは奇妙に出力されます:
unsigned long long microtime=0;
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 };
gettimeofday(&time_camera,NULL);
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec);
次の出力が得られます。
>> Times is now 484305845 , time since epoch in seconds is: 1357751315
ただし、計算を別の行に分割すると、機能します。:
unsigned long long microtime=0;
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 };
gettimeofday(&time_camera,NULL);
microtime = time_camera.tv_sec;
microtime = microtime * 1000000;
microtime = microtime + time_camera.tv_usec;
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec);
出力は次のとおりです。
Times is now 1357751437422143 , time since epoch in seconds is: 1357751437
これが機能するのは単なる偶然ですか?たとえば、メモリを破損したり、実際にどこかでメモリを超えたりしましたか? おそらくそれはMIPSコンパイラですか?どんな助けでも大歓迎です!