gpt4 book ai didi

c++ - std::tm 或 std::gmtime 的限制是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:10 25 4
gpt4 key购买 nike

std::gmtime 在我传递最大可能的 std::time_t 时对我来说失败了。请参阅以下测试:

std::cout   << "sizeof(std::time_t): " << sizeof(std::time_t) << '\n'
<< "sizeof(long long): " << sizeof(long long) << '\n'
<< "sizeof(unsigned int): " << sizeof(unsigned int) << "\n\n";

auto testgmtime = [](std::time_t time)
{
std::tm* ptm = std::gmtime(&time);
std::cout << (ptm ? "succeeded\n" : "failed\n");
};

testgmtime(std::numeric_limits<std::time_t>::max());
testgmtime(std::numeric_limits<long long>::max());
testgmtime(std::numeric_limits<long long>::max()-1);
testgmtime(static_cast<std::time_t>(std::numeric_limits<unsigned int>::max())*2);
testgmtime(std::numeric_limits<int>::max());

输出:

sizeof(std::time_t): 8
sizeof(long long): 8
sizeof(unsigned int): 4

failed
failed
failed
succeeded
succeeded

我正在使用 VS2012。是否有我没有看到的标准限制,或者这个 VS 很糟糕?我可以使用什么替代方法有效

最佳答案

VS2012 并不糟糕。算一下。

如果 time_t 是一个 64 位整数,那么其中的最大秒数是 264-1 如果它是一个无符号整数或 263 如果是有符号整数则为-1。

粗略地说,263 秒对应于 263/(60*60*24*365) ≈ 2.9*1011 年。

time_ttm_year是一个32位的int,其最大值为231-1 ≈ 2.1*109

显然,您不能将 ~2.9*1011 存储在 32 位有符号整数中。当您要求 gmtime() 正确地失败时。

您可以在 this answer 中修改我对 gmtime() 的实现处理非常大的值。您需要解决 SecondsSinceEpoch + 11644473600ULL 中的溢出问题,并将一些 intsuints 更改为 uint64s

关于c++ - std::tm 或 std::gmtime 的限制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11489260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com