当从 "LLONG_MAX seconds "构造一个std::chrono::milliseconds变量时,发生了什么?

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

当从 "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)

我不知道这里发生了什么,是溢出还是未定义行为?

c++ chrono
2个回答
1
投票

你在转换从 secondsmilliseconds.

在你的机器上,两个 secondsmilliseconds 用有符号的64位整数表示。 但要转换 secondsmilliseconds,库乘以1000。

你实际上是这样做的。

cout << LLONG_MAX*1000 << '\n';

在我的机器上打印出来的是:

-1000

0
投票

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().

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