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.mzph.cn/news/529800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c 语言 readline,如何用C实现一个readLine()函数- 该函数每次读入文本文件的一行并打印到屏幕...

如何用C实现一个readLine()函数- 该函数每次读入文本文件的一行并打印到屏幕(2012-04-13 00:23:41)标签:打印文本文件如何杂谈如何用C实现一个readLine()函数? 该函数每次读入文本文件的一行并打印到屏幕以前看到过这方面的讨论http://bbs.chinaunix.net/viewthrea…

c4droid语言游戏,c4droid手机编程软件下载

c4droid可以说是手机端最好的编程软件,没有之一,软件可以帮助大家在手机上进行编写C代码,让各位程序员们随时随地都能编程。操纵简单,功能强大。c4droid软件介绍c4droid是款Android设备上的C/C程序编译器,默认以tcc(tiny c compil…

创业冲突的五种解决方法是_不会说话,不懂处理人际冲突怎么办?《沟通的艺术》5步教会你...

关注“夏娃蓝空间”,陪你成长为更好的自己。想要良好地解决冲突,一定要有“这是我们两个人共同的事”的态度。今年夏天最热门的电视剧非《三十而已》莫属了,而撑起了这部剧的流量的广大观众,基本都是集中在逐步靠近中青年阶段的90…

android gsensor 坐标,MTK Android G sensor 原理,配置,调试

原理图: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的…

网贷大数据什么时候会好_如果人类把地球钻穿了,会发生什么?大数据分析告诉你多可怕...

很多科研人员在做实验的时候,少不了被旁人嘲笑或者蔑视的情况,因为常人往往是无法理解他们的想法的。例如曾经就有科研人员想要对地球进行钻探,看看能够在地表上钻多深,是否能够将地球给钻穿了。很多人都会认为这种做法没有意义而…

android h5 有广告,那些H5在Android上显示的丧心病狂的坑

首先得强调一下,H5和移动设备的交互遇到的问题真的是各种丧心病狂!!但是本主依然还是耐着极大的兴致(无奈)的做了下去。H5页面在Android或者IOS上运行出现问题(这里的运行指的是h5的页面运行在App里的webview里),测试人员或者上级…

小米9android q测试版,基于Android Q的MIUI来了 小米9尝鲜

01基于Android Q的MIUI来了中关村在线消息:谷歌在今年五月份发布了最新的Android Q系统,虽然很多国产手机还没有升级到Android P,但是还是有不少厂家开始对旗下的手机升级到最新的Android Q系统,根据小米最新的官方的消息&#xf…

android layerlist bitmap,android shape类似的 另一个 高端用法:layer-list

android shape类似的 另一个 高端用法:layer-list:简介:将多个图片或上面两种效果按照顺序层叠起来” 《?xml version"1.0" encoding"utf-8"?>《layer-listxmlns:android"http://schemas.android.com/apk/res/…

nedc和epa续航里程什么意思_400公里已成续航新起点,纯电动车的实用性到底怎样...

对于购买纯电动汽车的用户来说,续航里程是非常重要的参考因素,毕竟如果续航里程太短,实用性将会大打折扣,跑个长途都心惊胆战的,生怕路上遇到堵车了、没电了、中途没有加油站之类的。就算是不考虑长途,市区…

java class类_关于创建java中的class类的对象的方法

1.由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:①通过Class.forName()静态方法返回Class类的一个实例Class cls Class.forName("test.dog - 这个网站可出售。 - 最佳的test 来源和相关信息。");②通过类名.class来获取…

linux 正则查找email_Hello Iris简易微博类App开发教程3-查找用户和用户登录

用户邮箱地址有效性验证在上一节中,我们编写了用于用户注册的代码。但是当时并没有为用户的Email添加有效性验证,导致Email被设置为任何字符串都能注册成功。所以在本节初,我们首先来为Email添加一个有效性验证。首先还是来编写测试数据&…

原生的html组件,如何创建HTML5与原生UI组件混合的移动应用程序

本文将介绍如何使用Trigger.io创建原生的顶部栏、标签栏、以及HTML/CSS/JavaScript的混合型移动应用程序。以后我们将添加更多的原生UI组件到Trigger.io,但现在你只需要使用web技术就可以在IOS和Android上创建漂亮而流畅的移动应用。这是一个简单的菜谱应用程序的屏…

c语言不会可以学好java吗_有人说学了C语言,两天就能学会Java,两个星期就可以找工作?...

作为一个过来人来说,编程如果真的那么简单就不会导致现在各大公司还喊着招不到人的情况了,虽然编程领域里面有触类旁通的说法,但这个说法只是针对于对于一种编程已经掌握到一定程度了,不是简单的学过或者做过就可以轻松的转向别的…

wps合并所有sheet页_WPS里面如何批量打印(WPS2019)

WPS里面如何批量打印(WPS2019)分四步:1. 创建WPS表格获奖名单2. 创建WPS文字的获奖模板3. 将WPS表格名单内容调入到WPS文字奖状模板中4. 批量打印(或保存)(注:我在这里用了别人的office版本的表…

keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践

MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段。本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求、各高可用技术特点对比、实施、测试等过程进行整理,完善Mysql高可用方案,同时…

小爱同学100个奇葩回复_小米小爱音箱Pro开箱评测,看到的不仅是全面升级更是小米loT的高速发展...

Hello,大家好,这里是科技能量站,今天有何大家见面了,本期小编给大家带来的是小米最新推出的小爱同学“小米小爱音箱Pro”,小米在前两年推出了自家的小米AI音箱,那一刻起,智能语音人工助手在小米…

你了解的继承方式html,法定继承、遗嘱继承、遗赠,这三种房产过户方式你了解多少?...

在房产过户的中,与继承相关的方式有三种:法定继承、遗嘱继承和遗赠。这三种过户方式其实是有较大不同的,下面我们就来具体分析下,希望能对需要的朋友有帮助。过户在房产过户中,与继承相关的有三种,分别是法…

wedo2.0编程模块介绍_福特福克斯TCM重新编程操作

适用范围支持车型/年款:新福克斯 2011 – 2018 1.6L/2.0L DPS6变速箱 车型嘉年华 2013 1.5L DPS6变速箱 车型翼博 2013 – 2016 1.5L DPS6变速箱 车型功能介绍升级ECU版本或者对空白ECU写入数据, PAD Ⅲ请使用有线连接进行编程, 测试时保证车辆电瓶电压充足条件要求…

必须重启计算机才能关闭用户账户控制,Win10系统怎么彻底关闭用户帐户控制?...

大多是win10系统用户都知道,微软所推出的用户帐户控制能够限制一些病毒程序启动,从而较好的保护我们的电脑安全,以达到降低win10系统中毒的风险。可是每当我们运行一个程序的时候系统总会出现提示,感觉很烦,那么怎么永…

三菱plcfx5u指令手册_从西门子200的PLC程序来看三菱FX5U的PLC程序

小型PLC系统中西门子200系列和三菱的FX系列是应用的比较多的,作为工控行业的工程师是很有必要明白他们之间的一些不同点的,特别是从程序上来说,因此来写一篇文章,简单的聊聊他们在编程上的一下不同!西门子PLC和三菱PLC…