2

我一直在阅读Y2038 问题,我知道它time_t最终会恢复为可表示的最低负数,因为它会尝试“增加”符号位。

根据该维基百科页面,time_t无法更改为无符号整数,因为它会破坏处理早期日期的程序。(这是有道理的。)

但是,我不明白为什么一开始就没有将它设为无符号整数。为什么不将 1970 年 1 月 1 日存储为零而不是一些可笑的负数?

4

3 回答 3

6

因为让它从有符号的 −2,147,483,648 开始相当于让它从无符号的 0 开始。它不会改变 32 位整数可以容纳的值的范围 - 32 位整数可以容纳 4,294,967,296 种不同的状态。问题不是起点,问题是整数可以容纳的最大值。缓解该问题的唯一方法是升级到 64 位整数。

另外(正如我刚刚意识到的那样):1970 被设置为 0,所以我们也可以回到过去。(当时回溯到 1901 年似乎就足够了)。如果他们没有签名,那么这个时代将从 1901 年开始,以便能够从 1970 年回到过去,我们将再次遇到同样的问题。

于 2011-01-29T23:29:51.363 回答
3

这里有一个比使用无符号值更根本的问题。如果我们使用无符号值,那么我们只会得到更多的计时。这肯定会产生积极的影响——它将使我们可以保留的时间增加一倍——但我们在未来很晚就会遇到问题。更一般地说,对于任何固定精度的整数值,我们都会遇到这些问题。

在 1970 年代开发 UNIX 时,拥有 60 年时钟听起来不错,但显然 120 年时钟会更好。如果他们使用了更多的位,那么我们的时钟就会更长——比如 1000 年——但是在这么长的时间过去之后,我们会马上回到同样的状态,并且可能会回想起来说“他们为什么不使用更多位?”

于 2011-01-29T23:31:53.813 回答
1

因为并非所有系统都必须纯粹处理“过去”和“未来”值。即使在 70 年代,当创建 Unix 并定义时间系统时,他们也不得不处理 60 年代或更早的日期。所以,有符号整数是有意义的。

一旦每个人都切换到 64 位 time_t's,我们将不必担心 y2038k 类型的问题再过 20 亿左右 136 年的时间。

于 2011-01-29T23:30:55.293 回答