Y2K bug再现:2038bug

2006年3月30日 | Author: zhangdi | 标签: ,

电脑是用位(bit)来存储数字的,一位可以存储一个2进制数。一般来说,计算机中会有几种规格的数字单位,16bit,32bit,64bit等。2038bug就是32bit整数导致的问题。大多数编程语言和程序在存储时间的时候并不会分别存储年月日的信息,而是存一个整数。这个整数表示的是自1970年1月1日到当时经过的毫秒数。拿Java来举例,在我写这篇blog的时候,时间是Thu Mar 30 22:34:33 CST 2006,数字表示为1143729273828。

电脑中32bit的数字一般最高位是用来标志符号的,所以最大值为231-1=2,147,483,647 。如果再加1,就会变为-2147483648。而1970.1.1日后的这么多毫秒恰好为GMT 03:14:07, Tuesday, January 19, 2038。从1970.1.1之前2147483648这么多毫秒,恰好是20:45:52, Friday, December 13, 1901,所以国外很多媒体称之为“Friday the Thirteenth Bug”。很诡异,怎么又一个13号星期五。。。

在Java中,日期是使用Long这个数字类型来存储的,此类型是64bit的,所以Java语言是不会存在2038问题的。

如果想试验一下自己的系统是不是经得起2038的考验,可以把自己的系统时间调到2038.1.19后试试看。经过网上某些人的试验,似乎卡巴斯基(Kaspersky)会崩溃(我没有验证)。

了解详情:
http://www.2038bug.com/
http://www.deepsky.com/~merovech/2038.html

目前还没有任何评论.