当从 "LLONG_MAX seconds "构造一个std::chrono::milliseconds变量时,其结果是 t_milli.count()
是 -1000
auto t_max_seconds = std::chrono::seconds(LLONG_MAX);
auto t_milli = std::chrono::milliseconds(t_max_seconds);
据我所知,不知为何"-1"来自 "LLONG_MAX",而"1000"为比值。(对于 "微秒",结果是-1'000'000)
我不知道这里发生了什么,是溢出还是未定义行为?
你在转换从 seconds
到 milliseconds
.
在你的机器上,两个 seconds
和 milliseconds
用有符号的64位整数表示。 但要转换 seconds
到 milliseconds
,库乘以1000。
你实际上是这样做的。
cout << LLONG_MAX*1000 << '\n';
在我的机器上打印出来的是:
-1000
std::chrono::seconds
是一个 std::chrono::duration<>
,就像 std::chrono::milliseconds
. 如你所料 std::chrono::milliseconds
比率为 std::milli
,也就是 std::ratio<1,1000>
.
这里的 "未定义行为 "是指 std::chrono::seconds
可能只有35位。只有 std::chrono::nanoseconds
需要有64位的(签名)表示方式,以及 LLONG_MAX
甚至可以比这更高。
当然,你可以定义 using seconds = std::chrono::duration<std::int64_t>;
. 没有什么神奇的 std::chrono::seconds
. 将其转换为毫秒自然有其自身的溢出风险。
我猜你想要的是 std::chrono::seconds::max()
.