从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?

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

本文关键字:变量 发生了 什么 std LLONG MAX 构造 chrono      更新时间:2023-10-16

当从"LLONG_MAX秒"构造一个 std::chrono::毫秒的变量时,结果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(

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

您在从secondsmilliseconds的转换中出现签名溢出。

在您的计算机上,secondsmilliseconds都由有符号的 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().