Time 时间作为有符号整数

Time 时间作为有符号整数,time,unsigned,signed,year2038,Time,Unsigned,Signed,Year2038,我一直在阅读,我知道time\u t最终将恢复为最低的可表示负数,因为它将尝试“递增”符号位 根据维基百科的页面,将time\u t更改为无符号整数是不可能的,因为这会破坏处理早期日期的程序。(这是有道理的。) 然而,我不明白为什么它一开始就不是一个无符号整数。为什么不把1970年1月1日存储为零而不是一些可笑的负数呢?因为让它从签名开始−2147483648相当于让它从未签名的0开始。它不会改变32位整数可以保存的值的范围-32位整数可以保存4294967296个不同的状态。问题不是起点,问题

我一直在阅读,我知道
time\u t
最终将恢复为最低的可表示负数,因为它将尝试“递增”符号位

根据维基百科的页面,将
time\u t
更改为无符号整数是不可能的,因为这会破坏处理早期日期的程序。(这是有道理的。)


然而,我不明白为什么它一开始就不是一个无符号整数。为什么不把1970年1月1日存储为零而不是一些可笑的负数呢?

因为让它从签名开始−2147483648相当于让它从未签名的0开始。它不会改变32位整数可以保存的值的范围-32位整数可以保存4294967296个不同的状态。问题不是起点,问题是整数可以容纳的最大值。缓解此问题的唯一方法是升级到64位整数


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

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


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

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


20世纪70年代开发UNIX时,60年的时钟听起来不错,但显然120年的时钟会更好。如果他们使用了更多的比特,那么我们的时钟就会更长——比如说1000年——但经过这么长的时间,我们就会回到原来的状态,可能会回想起“他们为什么不使用更多比特?”

因为这样写的人知道这不会是他们的问题?;)我明白。但是作为一个无符号整数不是更直观吗?好吧,如果他们没有符号,他们会让1900年(1901年看起来很奇怪)成为一个新纪元,然后我们就有了y2038k问题。。。又是2038年,可能是的。然而,问题依然存在——空间将耗尽。