2013-01-22 71 views
0
gcc 4.7.2 
c89 
APR 1.4 

你好,铸造apr_time_t不同int型

我编译我的程序在32位模式下即-m32一些我在使用32位库链接库。

我有以下结构:

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

因为我想有一个随机数,所以我现在用的是APR的ID:

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值时间值。

哪个是最好的方式来演绎这个?

非常感谢您的任何建议,

回答

1

考虑使用apr_time_usec为所需的随机数。 apr_time_usec似乎是“更随机”,因为它返回的是第二部分(整个时间是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位音域一些聪明那么仅仅通过截断。