初音
光坂基金会
光坂基金会
  • 注册日期2010-05-29
  • 最后登录2015-10-10
  • 生日1990-10-3
  • 光玉722颗
阅读:1045回复:13

[讨论]计算机世界的末日?

楼主#
更多 发布于:2011-04-14 10:32
不知道大家有没有发现,绝大多数操作系统、应用软件、数据库、网站的“日期显示”或者“日期设置”,其极限为2038年1月19日。
那么在2038年1月19日之后呢,相信我们当中的绝大多数人应该还是活着的。所以这一天迟早要经历。
可以做个小实验,把系统的时间调到2038年1月19日,看看会有多少程序崩溃,有多少软件无法使用,比如登陆上IM,给好友发个消息,IM就将崩溃。
事实上那一天还不止会发生这些事情,手机网络工作不正常,卫星脱离轨道等等。
也许有人觉得2038年还早着,无需担心这个问题。不幸的是,上世纪60年代的程序开发人员也抱有类似的错误想法,并由此造就了千年虫。给全球IT业带来惨重损失,同时也给非洲的冈比亚等国家带来了灭顶之灾。
造成这种问题的原因,在于有那么一种变量类型 long ,或是 __int32 。对于32位的数据来说,它所能表示的范围在 0 ~ 0xFFFFFFFF 之内,以十进制表示就是 -2147483648 ~ 2147483647 ,事实上,我们通常只用到了正数的部分,也就是21亿多。而用它来表示时间的话,也就是21亿秒,也就是68年。
也许有人会说那个时候也许人们早就用上256位的系统了。但是仍会有许多使用中的32位甚至更古老的系统。即使是在32位系统盛行的今天,大多数嵌入式系统仍是8位或16位的,而小型嵌入式系统的数量其实比台式机更多。


而现在的计算机系统的时间都是从1970年算起的。不信大家可以试试,无论怎么设置,都不可能把时间设置到1969年的。这主要归功于 time_t 变量类型。在非常权威的MSDN中关于函数 time 的描述如下:


The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated universal time, according to the system clock. The return value is stored in the location given by timer. This parameter may be NULL, in which case the return value is not stored.



这段话的意思只有一个:系统只能从1970年开始计时。那么1970年开始往后数21亿秒,就是2038年1月19日。

我们还可以用C++来验证
#include <stdio.h>#include <time.h>
void main(){    struct tm TheLastDay = { 7, 14, 3, 19, 0, 138 }; // 秒 分 时 日 1+月 1900+年    struct tm TheNextSecOfTheLastDay = { 8, 14, 3, 19, 0, 138};    time_t TheLastSec, TheNextSecOfTheLastSec;    TheLastSec = mktime( ;TheLastDay );    TheNextSecOfTheLastSec = mktime( ;TheNextSecOfTheLastDay );    printf("用 time_t 计时的最后一刻是:%s", asctime( ;TheLastDay ));    printf("自 1970/01/01 00:00:00 共经历了 %d 秒,或者 0x%X 秒\n",        TheLastSec, TheLastSec);    printf("再过一秒,经历的时间就变为:%d 秒,或者 0x%X 秒\n",        TheNextSecOfTheLastSec, TheNextSecOfTheLastSec);}

输出结果如下:
用 time_t 计时的最后一刻是:Tue Jan 19 03:14:07 2038自 1970/01/01 00:00:00 共经历了 2147454847 秒,或者 0x7FFF8F7F 秒再过一秒,经历的时间就变为:-1 秒,或者 0xFFFFFFFF 秒

所以,下一个千年虫根本不用等1000年,20年就够了。
喜欢0 评分0
游客

返回顶部