在 uint32 中存储自纪元以来的毫秒数是否安全

noo*_*oob 6 c++

我目前正在重写一些旧代码并遇到了这个:

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 位将会丢失,他们只关心差异)他们仍然保持毫秒精度吗?(是)请注意,他们通过网络发送此“时间戳”并仍然使用它进行计算。

Joh*_*nck 3

不,它不“安全”:它牺牲了便携性、准确性或两者兼而有之。

如果您只关心低位,例如,如果您在网络上发送这些时间,然后在另一端对它们进行比较,最大差异约为 400 万秒(46 天),那么它是可移植的。

int如果您仅在64 位系统上运行此代码,那么它是准确的。类似的机器有一些,但不多。