time_t c語言 2038,什么是2038問題?

什么是2038問題

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

151b1b33e37375c4dc8372e2f9367236.png

Unix時間戳

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

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

#include

#include?

int?main?(void)

{

time_t?rawtime=10;//time(NULL)獲取當前時間戳

struct?tm?info;

//轉為tm結構

localtime_r(?&rawtime,&info);

//轉為字符串

printf("時間為:?%s\n",?asctime(&info));

return?0;

}

運行結果:

時間為:?Thu?Jan??1?08:00:10?1970

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

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

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

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

typedef?long?time_t

我們知道,在32位程序下面,long占用四個字節空間:

#include

#include?

int?main(void)

{

printf("long?size:%zd\n",sizeof(long));

printf("long?max:%ld\n",LONG_MAX);

return?0;

}

編譯運行:

$?gcc?-m32?-o?main?main.c

$?./main

4

2147483647

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

溢出引發的問題

也就是說,一旦時間戳的值大于四字節的LONG_MAX,time_t將會無法正確存儲這個時間戳。

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

#include

#include?

int?main?(void)

{

time_t?rawtime=2147483648;//time(NULL)獲取當前時間戳

struct?tm?info;

//轉為tm結構

localtime_r(?&rawtime,&info);

//轉為字符串

printf("時間為:?%s",?asctime(&info));

return(0);

}

然后我們編譯運行:

$?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來表示,我們運行之后,也發現結果出乎我們的意料,它竟然是一個1901年的時間!

2038問題

那這和2038有什么關系呢?

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

間為:?Tue?Jan?19?11:14:08?2038

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

總結

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

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

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

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

【編輯推薦】

【責任編輯:趙寧寧 TEL:(010)68476606】

點贊 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言精度控制整形,C語言 湊算式 控制精度問題

想問一下,if語句中為什么寫上*1.0之后,輸出的就是對的個數29,但把*1.0刪掉后,輸出的個數就遠大于29了?還想討教一下各位高手,除了這種暴力求法,還有其他的比較好的方法嗎?非常感謝/*…

c語言 l l next,nexttowardl

在頭文件中定義float nextafterf( float from, float to );(1)(since C99)double nextafter( double from, double to );(2)(since C99)long double nextafterl( long double from, long double to );(3)(since C99)float nexttowardf( float from, long doub…

c 語言 readline,如何用C實現一個readLine()函數-?該函數每次讀入文本文件的一行并打印到屏幕...

如何用C實現一個readLine()函數- 該函數每次讀入文本文件的一行并打印到屏幕(2012-04-13 00:23:41)標簽:打印文本文件如何雜談如何用C實現一個readLine()函數? 該函數每次讀入文本文件的一行并打印到屏幕以前看到過這方面的討論http://bbs.chinaunix.net/viewthrea…

STC單片機C語言中的數據類型,stc單片機c語言程序設計 第9章 stc單片機c語言數據類型.pdf...

STC單片 機C語言變量和數據類型主講:何賓Email :hebinmail.buct.edu.cn2016.03C語言中的常量和變量對于基本數據類型,按其值是否可變又分為常量和變量兩種。在程序執行過程中,其值不發生改變的量稱為常量,其值可變的量…

c4droid語言游戲,c4droid手機編程軟件下載

c4droid可以說是手機端最好的編程軟件,沒有之一,軟件可以幫助大家在手機上進行編寫C代碼,讓各位程序員們隨時隨地都能編程。操縱簡單,功能強大。c4droid軟件介紹c4droid是款Android設備上的C/C程序編譯器,默認以tcc(tiny c compil…

c語言圖像函數怎么用,請教 怎么才能用C輸出一個函數的圖像?大俠 幫幫忙啊...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓發一下我當年的練習程序#include#include#include#includedouble exp(double x){double l,m;unsigned int n;l1; m1; n0;do {n;mx*m/n;llm; }while ((-1.0E-6<m)&&(m<1.0E-6));return l; }main(){int graphmode, gra…

創業沖突的五種解決方法是_不會說話,不懂處理人際沖突怎么辦?《溝通的藝術》5步教會你...

關注“夏娃藍空間”&#xff0c;陪你成長為更好的自己。想要良好地解決沖突&#xff0c;一定要有“這是我們兩個人共同的事”的態度。今年夏天最熱門的電視劇非《三十而已》莫屬了&#xff0c;而撐起了這部劇的流量的廣大觀眾&#xff0c;基本都是集中在逐步靠近中青年階段的90…

android gsensor 坐標,MTK Android G sensor 原理,配置,調試

原理圖&#xff1a;g_sensor的驅動目錄在mediatek/custom/common/kernel/accelerometer下。一、g_sensor 的移植步驟1、在ProjectConfig.mk中配置相關的g_sensor例如 CUSTOM_KERNEL_ACCELEROMETER kxtf92、在mediatek/custom/common/kernel/accelerometer目錄中添加 g_sensor的…

網貸大數據什么時候會好_如果人類把地球鉆穿了,會發生什么?大數據分析告訴你多可怕...

很多科研人員在做實驗的時候&#xff0c;少不了被旁人嘲笑或者蔑視的情況&#xff0c;因為常人往往是無法理解他們的想法的。例如曾經就有科研人員想要對地球進行鉆探&#xff0c;看看能夠在地表上鉆多深&#xff0c;是否能夠將地球給鉆穿了。很多人都會認為這種做法沒有意義而…

android h5 有廣告,那些H5在Android上顯示的喪心病狂的坑

首先得強調一下&#xff0c;H5和移動設備的交互遇到的問題真的是各種喪心病狂&#xff01;&#xff01;但是本主依然還是耐著極大的興致(無奈)的做了下去。H5頁面在Android或者IOS上運行出現問題(這里的運行指的是h5的頁面運行在App里的webview里)&#xff0c;測試人員或者上級…

python非貪婪匹配_Python中關于正則表達式非貪婪以及多行匹配功能詳解

這篇文章主要介紹了Python正則表達式非貪婪、多行匹配功能,結合實例形式分析了Python正則表達式中非貪婪及多行匹配功能的實現方法與相關注意事項,需要的朋友可以參考下本文實例講述了Python正則表達式非貪婪、多行匹配功能。分享給大家供大家參考&#xff0c;具體如下&#xf…

小米9android q測試版,基于Android Q的MIUI來了 小米9嘗鮮

01基于Android Q的MIUI來了中關村在線消息&#xff1a;谷歌在今年五月份發布了最新的Android Q系統&#xff0c;雖然很多國產手機還沒有升級到Android P&#xff0c;但是還是有不少廠家開始對旗下的手機升級到最新的Android Q系統&#xff0c;根據小米最新的官方的消息&#xf…

ios傳值給js_WKWebView JS與OC間相互傳值調用

寫在前面本文將介紹如何使用WKWebView進行JS與OC、OC與JS間的傳值和方法調用。前置條件1、導入WebKit.framework2、聲明WKWebViewJS調用OC原生方法1、前端在js文件中實現這里要注意messageHandlers后面跟著的deviceInfo要與原生的定義的一致。2、iOS 實現WKScriptMessageHandle…

android layerlist bitmap,android?shape類似的?另一個?高端用法:layer-list

android shape類似的 另一個 高端用法&#xff1a;layer-list&#xff1a;簡介&#xff1a;將多個圖片或上面兩種效果按照順序層疊起來” 《?xml version"1.0" encoding"utf-8"?>《layer-listxmlns:android"http://schemas.android.com/apk/res/…

跨域會報40幾_總結一下跨域的幾種情況

在網站開發中&#xff0c;經常會遇到跨域問題&#xff0c;下面總結一下集中常見的跨域問題。1. 不同域名屬于跨域&#xff0c;如&#xff1a;www.a.com 和www.b.com&#xff0c;另外www.a.com 和www.a.com.cn也屬于不同域名。2. 主域名和子域名(二級域名、三級域名等)跨域&…

android將拍攝的圖片存入sd卡中,Android將圖片保存至SD卡上

首先判斷SD卡是否插入-->public String getSDPath(){File SDdirnull;boolean sdCardExistEnvironment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);if(sdCardExist){SDdirEnvironment.getExternalStorageDirectory();}if(SDdir!null){return S…

nedc和epa續航里程什么意思_400公里已成續航新起點,純電動車的實用性到底怎樣...

對于購買純電動汽車的用戶來說&#xff0c;續航里程是非常重要的參考因素&#xff0c;畢竟如果續航里程太短&#xff0c;實用性將會大打折扣&#xff0c;跑個長途都心驚膽戰的&#xff0c;生怕路上遇到堵車了、沒電了、中途沒有加油站之類的。就算是不考慮長途&#xff0c;市區…

android廣播示例,android接受開機廣播事件

【實例簡介】【實例截圖】【核心代碼】package com.yin.servicetest;import com.yin.service.MyService;import android.app.ActivityManager;import android.app.ActivityManager.RunningServiceInfo;import android.content.BroadcastReceiver;import android.content.Contex…

java class類_關于創建java中的class類的對象的方法

1.由于Class類沒有公共構造方法&#xff0c;所有創建Class的對象的方法有以下幾種&#xff1a;①通過Class.forName()靜態方法返回Class類的一個實例Class cls Class.forName("test.dog - 這個網站可出售。 - 最佳的test 來源和相關信息。");②通過類名.class來獲取…

android remote shell,關于 Appium V1.7.2 新增的唯一安卓可執行 mobile 命令 shell 的疑問...

關于 mobile: shell 在更新日志中說明&#xff0c;是從 1.7.1 升級到 1.7.2 中 “Add --relaxed-security, and mobile: shell access to adb”&#xff0c;并搜索 github 中 appium 庫&#xff0c;找到需要配置 desiredcapabilities 中 relaxedSecurityEnabled 為 true&#x…