-3

我已经看过很多次了,例如在 UNIX 上,在MySQL 时间戳等中:Epoch 从 1970-1-1 开始,但可记录的最大年份是 2038。现在让我数一数:

2^32/60/60/24/365+1970
2106

因此,如果我们使用完整的 32 位,我们自然会毫无问题地到达 2106 年。但显然 2038 年仅对应 31 位。那么为什么我们要扔掉一点呢?通过使用完整的 32 位,我们可以希望我们不必解决这个问题,因为我们可能会首先摧毁地球......

对评论的反应:当然是因为它已经签名了,但是为什么时间戳必须被签名呢?这就是这个问题的重点。

4

2 回答 2

5

这听起来可能很疯狂,但人们可能想要表示 1970 年之前的日期。转换经典time_t值的解释只会带来麻烦。

2038 问题可以通过切换到具有相同规范的 64 位表示来回避。究竟应该如何做到这一点还有待商榷,因为能够表示未来数十亿年的日期是值得怀疑的,因为这种精度可以用来表示亚秒级的时间,但天真的解决方案总比没有好。

简短的回答是:我们使用有符号值,因为这就是标准。

于 2014-02-10T19:20:06.937 回答
2

这可能属于“为什么 time_t 签名而不是未签名”,在这种情况下,您可能有兴趣在这里听到这背后的原因:

最初对于 Unix time_t 应该带符号还是不带符号存在一些争议。如果无符号,它在未来的范围将加倍,推迟 32 位溢出(推迟 68 年)。但是,它将无法代表 1970 年之前的时代。当被问及这个问题时,丹尼斯·里奇表示,他并没有深思熟虑,但认为能够代表他一生中的所有时代。会好的。(Ritchie 出生于 1941 年,大约是 Unix 时间 -893 400 000。)共识是要签署 time_t,这是通常的做法。QNX 操作系统版本 6 的软件开发平台有一个无符号的 32 位 time_t,尽管旧版本使用有符号类型。

于 2014-02-10T20:04:09.253 回答