Paul's profile小笨牛的牛棚PhotosBlogListsMore ![]() | Help |
|
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还是济南的号码,由于还有话费没完,只能继续用着了,换号了再通知大家哈~~ |
|
|