Profil for Paul小笨牛的牛棚BilderBloggListerMer ![]() | Hjelp |
|
17.03.2008 有趣的"The Year-2038 Bug"这个问题类似千年虫,但是似乎比千年虫更厉害,因为千年问题只影响了一些牵扯到日期计算的实例,但这个似乎影响到了所有的以C标准库编写的系统,例如Unix/Linux系统。 先看看什么是2038问题: 引用自http://www.oioj.net/blog/user2/17385/archives/2006/212792.shtml Time_t 是C/C++ 等编程语言在内部代表/存储日期和时间的一种数据类型。Time_t实际上是一个代表秒数的整数,当它的值为0时,代表的时间是1970年1月1日12: 00:00;当Time_t=60时,则表示1970年1月1日12:01:00,依此类推。 所有32位电脑系统都用带符号32位整型来存储time_t的值,也就是说t_time只能用31位二进制数来表示(第一位用来表示正负号),而其最大值转换为十进制是2147483647,换算成日期和时间刚好是2038年1月19日03:14:07am(GMT),而这一秒过后,t_time的值将变成-2147483647,代表的是 1901年12月13日8:45:52pm,这样32位软硬件系统的日期时间显示就都乱套了。另外,无法接受time_t为负值的其他功能也将返回错误。 讨论: 这个问题虽然貌似离我们还早点,但是就像千年问题一样,到现在了我们好多嵌入式系统不还是8位、16位的吗?尽管64位在向我们招手。现在的time_t已经用64位来表示了,能表示的时间已经超过了预期的宇宙年龄,现在能看到这个的人都不会再遇到这个问题啦,o(∩_∩)o...哈哈。 尽管已经解决了这个问题,但是由于现在好多类似嵌入式系统很少或者无法更新,也就造成了巨大的修正成本,去完成类似系统的2038问题可能又要花费大量时间和金钱了。 看一个ANSI C的例子,来看看这个有趣的The Year-2038 Bug #include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <time.h>int main (int argc, char **argv) 返回的结果将是 1000000000, Sun Sep 9 01:46:40 20012147483647, Tue Jan 19 03:14:07 2038-2147483648, Fri Dec 13 20:45:52 1901是不是很有趣呢,哈哈~~PS:又要去单位住了,再次消失一段时间,朋友们有事找我,短信我就可以,13705403291还是济南的号码,由于还有话费没完,只能继续用着了,换号了再通知大家哈~~ Kommentarer (5)Hvis du vil legge til en kommentar, må du logge på med Windows Live ID (hvis du bruker Hotmail, Messenger eller Xbox LIVE, har du en Windows Live ID). Logg på Har du ikke en Windows Live ID? Registrer deg
TilbakesporingerURL-adressen for trackback av denne oppføringen er: http://paulzhang9.spaces.live.com/blog/cns!FF2C98FF649F1556!1054.trak Weblogger som refererer til denne oppføringen
|
|
|