广州个人网站备案要多久,wordpress数据库连接不上,wordpress美化编辑插件,网站建设网站服务流程什么是2038问题不知道你有没有听过2038问题?无论你是否听过#xff0c;本文将带你认识什么是2038问题。Unix时间戳定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。而在C语言中#xff0c;常用time_t来表示。举个例子…什么是2038问题不知道你有没有听过2038问题?无论你是否听过本文将带你认识什么是2038问题。Unix时间戳定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。而在C语言中常用time_t来表示。举个例子#include#include int main (void){time_t rawtime10;//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$ ./main42147483647可以看到对于32位程序而言long的最大值为2147483647。溢出引发的问题也就是说一旦时间戳的值大于四字节的LONG_MAX,time_t将会无法正确存储这个时间戳。举例来说最开始的程序编译为32位程序修改rawtime的值为2147483648运行结果为(注意溢出的结果是未定义的)#include#include int main (void){time_t rawtime2147483648;//time(NULL)获取当前时间戳struct tm info;//转为tm结构localtime_r( rawtime,info);//转为字符串printf(时间为: %s, asctime(info));return(0);}然后我们编译运行$ gcc -m32 -o main main.cwarning: 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