2038問題 linux 什麼是2038問題?

2021-10-16 11:18:37 字數 1681 閱讀 4400

id:shouwangxiansheng

不知道你有沒有聽過2038問題?無論你是否聽過,本文將帶你認識什麼是2038問題

定義為從格林威治時間2023年01月01日00時00分00秒(北京時間2023年01月01日08時00分00秒)起至現在的總秒數。

而在c語言中,常用time_t來表示。舉個例子:

執行結果:

時間為: thu jan  1 08:00:10 1970

在這裡,我給rawtime設定為10,從列印結果來看也知道是正確的了。(注意,由於我們的時區為東八區,所以得到的時間是八點。)

當然這裡的內容暫時不展開,主要關注time_t。

然而實際上,time_t到底是什麼?

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

typedef long time_t

編譯執行:

$ gcc -m32 -o main main.c

$ ./main

42147483647

可以看到,對於32位程式而言,long的最大值為2147483647。

也就是說,一旦時間戳的值大於四位元組的long_max,time_t將會無法正確儲存這個時間戳。

舉例來說,最開始的程式編譯為32位程式,修改rawtime的值為2147483648,執行結果為(注意,溢位的結果是未定義的):

然後我們編譯執行:

$ gcc -m32 -o main main.c

warning: this decimal constant is unsigned only in iso c90 [enabled by default]

$ ./main

間為: sat dec 14 04:45:52 1901

首先編譯的時候也有警告,原因在於2147483649無法使用time_t來表示,我們執行之後,也發現結果出乎我們的意料,它竟然是乙個2023年的時間!

那這和2038有什麼關係呢?

編譯為64位程式我們再次執行就會發現:

間為: tue jan 19 11:14:08 2038

這個4位元組整型表示的時間戳值只能表示到北京時間2023年1月19日11時14分07秒,一旦到了這時間之後,這些32位程式就可能執行異常,因為它們無法將此時間正確的識別為2023年,而可能會依個別實現而跳回2023年或2023年。

到此,想必你已經很清楚了。由於在32位程式中,time_t最大值為2147483647,即最多表示到北京時間2023年1月19日11時14分07秒,因此在此之後就會出現異常。

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

當然,如果採用無符號整型,這個錯誤會被延後到 2106 年。到那時,還會有32位的程式在執行嗎?

2038問題只是乙個引子,實際上在程式中有很多現在不會溢位而將來可能溢位的問題,你會關注嗎?

c語言入坑指南-緩衝區溢位

什麼是P問題,什麼是NP問題,什麼是NPC問題

參考 講的真好!非多項式級別 運算慢,巨大 o n o 多項式級的複雜度 運算快,比較小 o 1 o n o 該問題能夠找到乙個解決演算法,時間複雜度是o 1 o n o 多項式時間 的級別 找乙個解很困難,但驗證乙個解很容易。我們可能沒有乙個已知的快速的解決問題的方法,但是如果給我們乙個候選的答案...

什麼是問題?

今天看到一篇文章,說什麼是問題?看到這個標題很好奇。就點進去看了一下。以下是總結和思考。漫漫人生中,我們總會遇到各種各樣的問題。那麼什麼是問題呢?而解決方案,就是現狀到目標的路徑。那麼,什麼是目標呢?目標應該是符合真實的需求。那麼,什麼是需求呢?需求不僅包含當前這個問題,有時候它更需要考慮到整個系統...

什麼是NP問題?

什麼是np問題 概念 在計算機學科中,存在多項式時間的演算法的一類問題,稱之為p類問題 而像梵塔問題 推銷員旅行問題 命題表示式 可滿足問題這類,至今沒有找到多項式時間演算法解的一類問題,稱之為np類問題。拿推銷員旅行問題為例,假設推銷員亨利有向6個城市推銷公司產品的任務,並規定了乙個旅行預算。他手...