日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
什么是2038問(wèn)題?

什么是2038問(wèn)題

創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供高平網(wǎng)站建設(shè)、高平做網(wǎng)站、高平網(wǎng)站設(shè)計(jì)、高平網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、高平企業(yè)網(wǎng)站模板建站服務(wù),十多年高平做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

不知道你有沒(méi)有聽(tīng)過(guò)2038問(wèn)題?無(wú)論你是否聽(tīng)過(guò),本文將帶你認(rèn)識(shí)什么是2038問(wèn)題。

Unix時(shí)間戳

定義為從格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。

而在C語(yǔ)言中,常用time_t來(lái)表示。舉個(gè)例子:

 
 
 
  1. #include  
  2. #include  
  3. int main (void)  
  4.    time_t rawtime = 10;//time(NULL)獲取當(dāng)前時(shí)間戳 
  5.    struct tm info; 
  6.    //轉(zhuǎn)為tm結(jié)構(gòu) 
  7.    localtime_r( &rawtime,&info); 
  8.    //轉(zhuǎn)為字符串 
  9.    printf("時(shí)間為: %s\n", asctime(&info)); 
  10.    return 0; 

運(yùn)行結(jié)果:

 
 
 
  1. 時(shí)間為: Thu Jan  1 08:00:10 1970 

在這里,我給rawtime設(shè)置為10,從打印結(jié)果來(lái)看也知道是正確的了。(注意,由于我們的時(shí)區(qū)為東八區(qū),所以得到的時(shí)間是八點(diǎn)。)

當(dāng)然這里的內(nèi)容暫時(shí)不展開(kāi),主要關(guān)注time_t。

然而實(shí)際上,time_t到底是什么?

通常,time_t直接或者間接被定義為下面這樣:

 
 
 
  1. typedef long time_t 

我們知道,在32位程序下面,long占用四個(gè)字節(jié)空間:

 
 
 
  1. #include 
  2. #include  
  3. int main(void) 
  4.     printf("long size:%zd\n",sizeof(long)); 
  5.     printf("long max:%ld\n",LONG_MAX); 
  6.     return 0; 

編譯運(yùn)行:

 
 
 
  1. $ gcc -m32 -o main main.c 
  2. $ ./main 
  3. 2147483647 

可以看到,對(duì)于32位程序而言,long的最大值為2147483647。

溢出引發(fā)的問(wèn)題

也就是說(shuō),一旦時(shí)間戳的值大于四字節(jié)的LONG_MAX,time_t將會(huì)無(wú)法正確存儲(chǔ)這個(gè)時(shí)間戳。

舉例來(lái)說(shuō),最開(kāi)始的程序編譯為32位程序,修改rawtime的值為2147483648,運(yùn)行結(jié)果為(注意,溢出的結(jié)果是未定義的):

 
 
 
  1. #include  
  2. #include  
  3. int main (void)  
  4.    time_t rawtime = 2147483648;//time(NULL)獲取當(dāng)前時(shí)間戳 
  5.    struct tm info; 
  6.    //轉(zhuǎn)為tm結(jié)構(gòu) 
  7.    localtime_r( &rawtime,&info); 
  8.    //轉(zhuǎn)為字符串 
  9.    printf("時(shí)間為: %s", asctime(&info)); 
  10.    return(0); 

然后我們編譯運(yùn)行:

 
 
 
  1. $ gcc -m32 -o main main.c 
  2. warning: this decimal constant is unsigned only in ISO C90 [enabled by default] 
  3. $ ./main 
  4. 間為: Sat Dec 14 04:45:52 1901 

首先編譯的時(shí)候也有警告,原因在于2147483649無(wú)法使用time_t來(lái)表示,我們運(yùn)行之后,也發(fā)現(xiàn)結(jié)果出乎我們的意料,它竟然是一個(gè)1901年的時(shí)間!

2038問(wèn)題

那這和2038有什么關(guān)系呢?

編譯為64位程序我們?cè)俅芜\(yùn)行就會(huì)發(fā)現(xiàn):

 
 
 
  1. 間為: Tue Jan 19 11:14:08 2038 

這個(gè)4字節(jié)整型表示的時(shí)間戳值只能表示到北京時(shí)間2038年1月19日11時(shí)14分07秒,一旦到了這時(shí)間之后,這些32位程序就可能運(yùn)行異常,因?yàn)樗鼈儫o(wú)法將此時(shí)間正確的識(shí)別為2038年,而可能會(huì)依個(gè)別實(shí)現(xiàn)而跳回1970年或1901年。

總結(jié)

到此,想必你已經(jīng)很清楚了。由于在32位程序中,time_t最大值為2147483647,即最多表示到北京時(shí)間2038年1月19日11時(shí)14分07秒,因此在此之后就會(huì)出現(xiàn)異常。

而如果使用64位整型,則可以記錄至約2900億年后的292,277,026,596年12月4日15:30:08,星期日(UTC)。

當(dāng)然,如果采用無(wú)符號(hào)整型,這個(gè)錯(cuò)誤會(huì)被延后到 2106 年。到那時(shí),還會(huì)有32位的程序在運(yùn)行嗎?

2038問(wèn)題只是一個(gè)引子,實(shí)際上在程序中有很多現(xiàn)在不會(huì)溢出而將來(lái)可能溢出的問(wèn)題,你會(huì)關(guān)注嗎?


分享題目:什么是2038問(wèn)題?
文章位置:http://m.5511xx.com/article/coghdih.html