我目前正在重写一些旧代码并遇到了这个:
gettimeofday(&tv, NULL);
unsigned int t = tv.tv_sec * 1000 + tv.tv_usec / 1000;
Run Code Online (Sandbox Code Playgroud)
这看起来确实像是他们试图将纪元以来的毫秒数存储在 uint32 中。当然,我认为这不合适,所以我做了一些测试。
#include <sys/time.h>
#include <stdint.h>
int main() {
struct timeval tv;
gettimeofday(&tv, nullptr);
uint32_t t32 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
int64_t t64 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我是对的:
(gdb) print t32
$1 = 1730323142
(gdb) print t64
$2 = 1423364498118
Run Code Online (Sandbox Code Playgroud)
所以我猜他们所做的事情并不安全。但他们在做什么、为什么这样做以及实际发生了什么?(在这个例子中,左边的 10 位将会丢失,他们只关心差异)他们仍然保持毫秒精度吗?(是)请注意,他们通过网络发送此“时间戳”并仍然使用它进行计算。
不,它不“安全”:它牺牲了便携性、准确性或两者兼而有之。
如果您只关心低位,例如,如果您在网络上发送这些时间,然后在另一端对它们进行比较,最大差异约为 400 万秒(46 天),那么它是可移植的。
int如果您仅在64 位系统上运行此代码,那么它是准确的。类似的机器有一些,但不多。