2

私のプロジェクトでは、次のように使用struct timespecしています

struct timespec start, end;
clock_gettime(CLOCK_REALTIME,&start);
/* Do something */
clock_gettime(CLOCK_REALTIME,&end);

値を次のように返します。((((unsigned64)start.tv_sec) * ((unsigned64)(1000000000L))) + ((unsigned64)(start.tv_nsec))))

この形式を使用している理由と、unsigned64この構造を詳細に理解するのを手伝ってくれる人はいますか?? コード実行時間のナノ秒精度での時間計算に関する研究でこのコードを使用しています

4

1 に答える 1

1

符号なしの 32 ビット型 (unsigned int最新のプラットフォームなど) の最大値は 40 億強です。5 に 10 億を掛けると (問題のコードで行ったように)、50 億の値が得られ、32 ビットの符号なし型に含めることができます。より高い値を保持できる 64 ビット型を入力します18446744073709551615(より正確には、のみの符号なし 32 ビットの最大値と比較します4294967295)。


ちなみに、コードは次のように簡略化できます

start.tv_sec * 1000000000ULL + start.tv_nsec

この単純化が可能なのは、コンパイラが必要に応じて低精度の型と値を高精度に自動的に変換するためです。式にunsigned long long(それがULL意味する)リテラル値があるため、式の残りの部分もに変換されunsigned long long、結果は type になりunsigned long longます。

于 2014-02-05T09:07:14.150 に答える