从 "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()
.
您在从 seconds
到 milliseconds
的转换中出现符号溢出。
在您的机器上,seconds
和 milliseconds
均由带符号的 64 位整数表示。但是要将seconds
转换为milliseconds
,库要乘以1000.
您正在有效地执行此操作:
cout << LLONG_MAX*1000 << '\n';
在我的机器上打印出:
-1000
从"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()
.
您在从 seconds
到 milliseconds
的转换中出现符号溢出。
在您的机器上,seconds
和 milliseconds
均由带符号的 64 位整数表示。但是要将seconds
转换为milliseconds
,库要乘以1000.
您正在有效地执行此操作:
cout << LLONG_MAX*1000 << '\n';
在我的机器上打印出:
-1000