从千年虫到Y2038 - Y2038问题释疑

按:记得在2000年,我还是一个7岁的孩子.那时,我只依稀知道一点点计算机知识.而千年虫问题充斥了所有媒体,甚至在六一儿童节CCTV还播放了渲染这个问题的动画片.无知的我竟然认为这是一种类似于"黑色星期五"或CIH的定期发作强力病毒,包括我身边的很多人都这样认为.在八年后的今天,Y2038问题来临30年倒计时之日,我写下这篇文章,来分享我所了解的一些事实.

1.时间与空间

有人说,时间如同射出去的箭,永远不会回头.

现在是2008年.那么,一万年后的今天就是12008年,十万年后的今天就会是102008年......只要我们继续使用公元纪年法,这个数字就会无限增长下去,而没有一个尽头.换句话说,我们表示时间的数字最大将是无穷大.

可我们计算机的设计决定了数字不可能无限增长.因为每个数字在计算机内存(以及硬盘)里占据的空间都是等量的,而不管它有多大或多小.举个例子,1和10000虽然相差一万倍,可他们都占用32个bit(4字节)

计算机刚被发明的时候,储存设备很贵,人们为了节约空间便图省事,储存一个年份的时候只储存最后两位.使用的时候前面加上19就可以了,非常方便.

习惯的力量是巨大的.尽管日后储存器越来越便宜,可这种表达方式却被延续下来.主要是因为程序员都认为自己的程序不会用那么长时间.

2.千年虫

终于,在接近2000年时,人们发现了这个问题.

2000年不仅首次出现了十位向百位进位,而且还是一个闰年.我们知道,闰年是为了修正规定一年为365天而与事实造成的偏差而规定的.可如果规定四年一闰的话还是会有偏差.因此,人们规定,如果年份能被100整除,这一年就不是闰年.而这样造成的偏差又由规定能被400整除的年份是闰年来修正,如此反复.

我们注意到,2000年能被400整除,因此是闰年.可如果程序员没有考虑到这一点,就会误认为这一年不是闰年.

而此时,计算机已经得到了前所未有的发展.我们的世界中,计算机变得无处不在.飞机用计算机控制,银行用计算机储存账户信息,火车用计算机调度......

在这里,我们不得不反思一下媒体起到的作用.各个媒体对此大加渲染,这本是好事.可有的不良媒体居然不惜歪曲事实,甚至唯恐天下不乱,大有制造社会恐慌之势.

事实证明,2000年平安度过.没有列车出轨飞机坠毁ATM机失灵......等一系列恐怖事件发生.也许这是得益于人们为此做的充分准备.

3.Y2038 Bug

UNIX系统中使用这样一种方式来表示时间:自1970年1月1日零点流逝的秒数.通常我们把用这种方式表示的时间称作UNIX时间戳.这种表示方式用一个整数就可以表示一个精确到秒的时间,因此得到了广泛的应用.

我们现在使用的是32位计算机,一个整数占用32个bit(二进制位).而第一个bit用于表示符号(也就是正负),因此最大可以表示的整数是231-1,也就是2147483647.

我们把这个时间换算成年,结果是68年多一点.换句话说,在1970+68=2038年,如同在2000年发生的一样,这个数字加1就会进位,而进位将会进到符号位.也就是,这个数字从一个非常大的正数变成了一个非常小的负数-- -2147483648

下面这个动画展示了这一过程(来自:Wikipedia)

Y2038 Problem

因为这个问题在2038年发生,我们一般称之为Y2038问题或Y2K38问题,英文是Y2038 Bug.千年虫的虫便由此得来.

4.解决与反思

在64位计算机中,这一问题将得到妥善的解决:64位计算机的整数占用64个bit,这样可以表示将近三千亿年以内的任何日期.而没有人会预料到,这三千亿年内会发生什么事情.

除了Y2K,Y2038,还将有Y10000,Y100000......这种问题永远无法得到根本解决,因为我们必须用一个有限量来表示一个无限的量,这本身是矛盾的.

我们需要反思的,我想是媒体起到的作用.维基百科上说,在香港,有很多市民认为千年虫是一种传染病或者瘟疫,结果出售"专治千年虫"的不法商家便大发横财.

诚然,计算机对于很多民众而言是一种高深莫测的东西.但媒体的责任在于,它应该向公众传播真相传播事实,而不是为了收视率而造出一些噱头.

 (原创作品)

3 Responses to “从千年虫到Y2038 - Y2038问题释疑”


  1. 1 LeoSic

    当时我爸单位有一大批回到20世纪初的机器……

  2. 2 LeoSic

    21世纪来的太突然,计算机们受不了啊……

  3. 3 Christmas

    “诚然,计算机对于很多民众而言是一种高深莫测的东西.但媒体的责任在于,它应该向公众传播真相传播事实,而不是为了收视率而造出一些噱头.”
    这段写得很不错哦.

Leave a Reply