gpt4 book ai didi

c++ - 在 uint32 中存储自 Epoch 以来的毫秒数是否安全

转载 作者:太空狗 更新时间:2023-10-29 21:19:07 24 4
gpt4 key购买 nike

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

gettimeofday(&tv, NULL);
unsigned int t = tv.tv_sec * 1000 + tv.tv_usec / 1000;

这看起来真的像是他们试图将自 Epoch 以来的毫秒数存储在 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;
}

我是对的:

(gdb) print t32
$1 = 1730323142
(gdb) print t64
$2 = 1423364498118

所以我猜他们正在做的事情并不安全。但是他们在做什么,为什么要这样做以及实际发生了什么? (在这个例子中,左边的 10 位将丢失,他们只关心差异)他们是否仍然保持毫秒精度? (是) 请注意,他们正在通过网络发送此“时间戳”并仍将其用于计算。

最佳答案

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

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

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

关于c++ - 在 uint32 中存储自 Epoch 以来的毫秒数是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com