std :: chrono time_t转换溢出?

问题描述 投票:1回答:2

我的示例代码:

time_t time_tee = 253402210800;
auto tp = std::chrono::system_clock::from_time_t(time_tee);
time_t tee2 = std::chrono::system_clock::to_time_t(tp);
std::cout << tee2 << std::endl;

期望:输出2534022108输出:-4852206231

time_t为64位,因此不应有溢出。

我在这里触发了哪种溢出?

Live demoWorks fine on MSVC

c++ chrono
2个回答
1
投票

[glibc system_clock::duration使用glibc存储时间点。 system_clock::durationchrono::nanoseconds

因为:

chrono::nanoseconds

计算在glibc上溢出。

我没有看到chrono::nanoseconds中对int64_t的任何约束,除了应该签名。

我在这里触发了哪种溢出?

当将253402210800 seconds = 253402210800000000000 nanoseconds INT64_MAX = 922337203685477580 转换为system_clock::rep内部的the standard draft时,system_clock::from_time_t(time_tee);乘以253402210800会在1000000000内部发生[签名溢出。我认为这将完全在time_t内部。

我认为您应该通过检查来防止溢出,例如:

system_clock::duration

1
投票

问题是time_point_cast<system_clock::duration>的时间分辨率。

此代码:

__duration_cast_impl

__duration_cast_impl上:

static_assert(
    std::chrono::duration_cast<std::chrono::seconds>
    (std::chrono::system_clock::duration::max()).count() > 253402210800
);

system_clock上:

#include <chrono>
#include <iostream>

int main()
{
    using std::chrono::system_clock;
    time_t time_tee = 253402210800;
    auto tp = system_clock::from_time_t(time_tee);
    time_t tee2 = system_clock::to_time_t(tp);
    std::cout << time_tee << std::endl;
    std::cout << tee2 << std::endl;
    std::cout << system_clock::period::num << std::endl;
    std::cout << system_clock::period::den << std::endl;

    return 0;
}

因此,您可以看到GCC和Clang使用的MSVC prints分辨率大100倍。请注意,与253402210800 253402210800 1 10000000 相比,这也是更好的分辨率,而成本则更受时间限制。

© www.soinside.com 2019 - 2024. All rights reserved.