大膽預(yù)測(cè)2038年電腦公司問(wèn)題始末
現(xiàn)在,由于受到媒體的廣泛關(guān)注,2000年問(wèn)題已經(jīng)為大多數(shù)人所理解。
大多數(shù)以C編程語(yǔ)言編寫(xiě)的程序基本不再受2000年問(wèn)題的影響,但又受到了2038年問(wèn)題的困擾。出現(xiàn)此問(wèn)題的原因是,大多數(shù)C程序都使用稱(chēng)為標(biāo)準(zhǔn)時(shí)間庫(kù)的例程庫(kù)。這個(gè)庫(kù)建立了一套用于存儲(chǔ)時(shí)間值的標(biāo)準(zhǔn)4字節(jié)格式,并提供了用于轉(zhuǎn)換、顯示和計(jì)算時(shí)間值的大量函數(shù)。
標(biāo)準(zhǔn)4字節(jié)格式假定:時(shí)間開(kāi)始于1970年1月1日中午12:00:00。那一刻的時(shí)間值為0,任何時(shí)間/日期值都以該零值之后經(jīng)過(guò)的秒數(shù)來(lái)表示。所以,值919642718表示1970年1月1日中午12:00:00之后經(jīng)過(guò)了919,642,718秒,即太平洋時(shí)間(美國(guó))的1999年2月21日星期日的16:18:38。這是一種方便的格式,因?yàn)橹灰獙芍迪鄿p,您就可以得到代表它們之間時(shí)間差的秒數(shù)。然后,您可以使用庫(kù)中的其他函數(shù)來(lái)確定這兩個(gè)時(shí)間之間相差多少分/小時(shí)/天/月/年。
如果讀過(guò)位與字節(jié)一文,您就會(huì)知道,帶有正負(fù)符號(hào)的4字節(jié)整數(shù)能夠表示的最大值是2,147,483,647,這就是2038年問(wèn)題的源頭。在反轉(zhuǎn)成負(fù)值(因而無(wú)效)之前,時(shí)間的最大值是2,147,483,647,轉(zhuǎn)換過(guò)來(lái)就是2038年1月19日。在那一天,任何使用標(biāo)準(zhǔn)時(shí)間庫(kù)的C程序都將開(kāi)始遇到日期計(jì)算方面的問(wèn)題。
幸運(yùn)的是,在大型機(jī)上,這個(gè)問(wèn)題的解決要比2000年問(wèn)題略微容易一些。編寫(xiě)規(guī)范的程序只需使用新版本的庫(kù)(例如,使用8字節(jié)值的存儲(chǔ)格式)重新編譯一次就可以了。之所以能夠這樣解決此問(wèn)題,是因?yàn)閹?kù)將整個(gè)時(shí)間活動(dòng)和自己的時(shí)間類(lèi)型與函數(shù)封裝在一起。這與多數(shù)大型機(jī)程序不同,那些程序沒(méi)有對(duì)自己的時(shí)間格式或計(jì)算進(jìn)行標(biāo)準(zhǔn)化。所以,解決2038年問(wèn)題就不會(huì)像解決2000年問(wèn)題那么困難了。
一位思維敏捷的讀者善意地指出,IBM PC硬件會(huì)受到2116年問(wèn)題的困擾。對(duì)于PC機(jī)來(lái)說(shuō),時(shí)間開(kāi)始于1980年1月1日,并以無(wú)正負(fù)符號(hào)的32位整數(shù)的形式按秒遞增,這與UNIX時(shí)間非常類(lèi)似。到2116年,這個(gè)整數(shù)將溢出。
Windows NT使用64位整數(shù)來(lái)計(jì)時(shí)。但是,它使用100納秒作為增量單位,且時(shí)間開(kāi)始于1601年1月1日,所以NT將遇到2184年問(wèn)題。
蘋(píng)果公司聲明,Mac在29,940年之前不會(huì)出現(xiàn)時(shí)間問(wèn)題!
評(píng)論