Profil for Paul小笨牛的牛棚BilderBloggListerMer Verktøy Hjelp

Blogg


    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

        例子出自http://www.2038bug.com/

    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <time.h>
     
    int main (int argc, char **argv)
    {
      time_t t;
      t = (time_t) 1000000000;
      printf ("%d, %s", (int) t, asctime (gmtime (&t)));
      t = (time_t) (0x7FFFFFFF);
      printf ("%d, %s", (int) t, asctime (gmtime (&t)));
      t++;
      printf ("%d, %s", (int) t, asctime (gmtime (&t)));
      return 0;
    }
    返回的结果将是
    1000000000, Sun Sep  9 01:46:40 2001
    2147483647, Tue Jan 19 03:14:07 2038
    -2147483648, Fri Dec 13 20:45:52 1901
     
    是不是很有趣呢,哈哈~~
     
    PS:又要去单位住了,再次消失一段时间,朋友们有事找我,短信我就可以,13705403291
    还是济南的号码,由于还有话费没完,只能继续用着了,换号了再通知大家哈~~

    Kommentarer (5)

    Vent litt...
    Kommentaren du har skrevet inn, er for lang. Du må forkorte den.
    Du har ikke skrevet inn noe. Prøv på nytt.
    Vi kan dessverre ikke legge til kommentaren nå. Prøv på nytt senere.
    Du må ha tillatelse fra den som kontrollerer kontoen, for å kunne legge til en kommentar. Be om tillatelse
    Den som kontrollerer kontoen, har deaktivert kommentarer.
    Vi kan dessverre ikke slette kommentaren nå. Prøv på nytt senere.
    Du har nådd grensen for antall kommentarer som kan legges inn per dag. Prøv på nytt om 24 timer.
    Kommentarfunksjonen i kontoen din er deaktivert fordi systemene våre har registrert at du kanskje sender ut søppelpost til andre brukere. Hvis du mener at deaktiveringen er gjort ved en feiltakelse, kontakter du kundestøtten for Windows Live.
    Gjennomfør sikkerhetskontrollen nedenfor for å gjøre ferdig kommentaren.
    Tegnene du skriver inn i sikkerhetskontrollen, må samsvare med tegnene på bildet eller i lydklippet.

    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

    21 Okt.
    li留言好困难啊!卡死!!你也不上网了,不知道青岛生活咋样!问个好
    9 Mai
    转战青岛了就没消息了啊!海上风浪大,自己注意点!嘿嘿!
    27 Apr.
    晓来霜skrev:
    只能看懂一点点呵呵外行~~~~~~
    顺便来给你踩踩~~~~~~
    4 Apr.
    Jerri Leeskrev:

    有意思...

    我居然能看懂你在说什么...我太厉害了我..哈哈...

    要加油哦~~~

    18 Mar.

    Tilbakesporinger

    URL-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
    • Ingen