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

What happened when constructing a variable of std::chrono::milliseconds from "LLONG_MAX seconds"?

从"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”是比率。
(对于 "microseconds",结果为 -1'000'000)

我想知道这里发生了什么,溢出或未定义的行为?

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

您在从 secondsmilliseconds 的转换中出现符号溢出。

在您的机器上,secondsmilliseconds 均由带符号的 64 位整数表示。但是要将seconds转换为milliseconds,库要乘以1000.

您正在有效地执行此操作:

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

在我的机器上打印出:

-1000