0
gcc 4.7.2
c89
APR 1.4

こんにちは、

プログラムを 32 ビット モードでコンパイルしています。つまり-m32、リンクしているライブラリの一部が 32 ビット ライブラリを使用しているためです。

私は次の構造を持っています:

struct tag_channel {
    apr_int32_t id;
    char *name;
};

IDには乱数が必要なので、APRを使用しています:

apr_time_t time_secs = apr_time_sec(apr_time_now());

apr_time_sec は次の apr_time_t タイプを返すため、キャストについて疑問に思っています。

typedef apr_int64_t

次のようにキャストできます。

channel->id = (apr_int32_t)time_secs;

ただ、キャストダウンによる価値の低下が気になります。

以下は64ビットなので、これが機能するかどうかはわかりません。

#define APR_TIME_T_FMT   APR_INT64_T_FMT

apr_time_tID値の時間値を持つことは本当に意味がないので、IDのチャネル構造を変更したくありません。

これをキャストする最良の方法はどれですか?

ご提案いただきありがとうございます。

4

1 に答える 1

1

apr_time_usec任意の乱数に使用することを検討してください。apr_time_usec は、usecond 部分 (全体の時間はsec + APR_USEC_PER_SEC * usec) を返し、定義により内部にあることが保証されているため、「よりランダム」に見えるため[0 .. 1000000]、キャストで精度が失われることを心配する必要はありません。

useconds ではなく seconds を使用することが重要な場合は、次のように乱数を計算できます。

channel->id = (apr_int32_t) (apr_time_sec(apr_time_now()) % INT32_MAX)

( を含めることを忘れないでくださいlimits.h)32ビットのダイアパソン内に収まるように、切り捨てよりもスマートにします。

于 2013-01-22T12:05:20.777 に答える