为何调用mktime(0,0,0,12,31,2040)会返回负整数-2054446096?
为什么调用
mktime(0, 0, 0, 12, 31, 2040)返回负整数? 参数传递完全错误:
mktime的参数对应struct tm的字段,顺序是tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year,其中:tm_mon是月份索引,范围是0(1月)到11(12月),你传入的31完全超出有效范围;tm_year是年份减去1900,你传入的2040实际表示1900+2040=3940年,这远超出常规时间范围。
32位
time_t溢出:多数系统中time_t默认是32位有符号整数,它的最大值是2^31-1,对应时间为2038年1月19日3时14分07秒。3940年的时间戳远大于这个阈值,会触发整数溢出,按补码规则最终返回负数。若要表示2040年12月31日0点0分0秒,正确的调用方式应为:
mktime(0, 0, 0, 31, 11, 2040-1900); // tm_mon=11对应12月,tm_year=140对应2040年但即使参数正确,若系统使用32位
time_t,2040年仍超出2038年上限,依然会溢出返回负数。只有当系统采用64位time_t时,才能正确返回正整数时间戳。
内容的提问来源于stack exchange,提问作者lubosdz
相关产品推荐
相关产品推荐

