变量运算溢出问题

最近犯了一个低级错误呀,记录一下这个教训吧,大概如下:

struct timespec {
    time_t tv_sec;
    long tv_nsec;
};
struct timespec ts;
uint64_t nsec = ts.tv_sec * 1000000000 + ts.tv_nsec;

也就是将 ts 换算成 nanoseconds,在 64-bit 系统上工作的没有问题,但 32-bit 系统上就杯具了。

这个地方可能会有两个问题:
1. 认为目标变量是 64-bit 就足够了,但乘法运算实际上是 (time_t) (tv.tv_sec * 1000000000),结果有可能溢出了。
2. 认为 time_t 类型在所有环境下都是足够的。(我就是认为它都是 64-bit 的)

Over!