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

我不想将 id 的通道结构更改为,apr_time_t因为为 ID 值设置时间值并没有任何意义。

哪个是最好的投射方式?

非常感谢您的任何建议,

4

1 回答 1

1

考虑使用apr_time_usec所需的随机数。apr_time_usec 似乎“更随机”,因为它返回 usecond 部分(整个时间是sec + APR_USEC_PER_SEC * usec)并且根据定义保证在内部[0 .. 1000000],因此您不必担心演员表会丢失精度。

如果使用秒而不是 useconds 是至关重要的,那么您可以将随机数计算为

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

(不要忘记包括limits.h)以将其放入 32 位音调中,然后通过截断更聪明一些。

于 2013-01-22T12:05:20.777 回答