从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
What happened when constructing a variable of std::chrono::milliseconds from "LLONG_MAX seconds"?
当从"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(
我想知道这里发生了什么,溢出或未定义的行为?
您在从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()
.
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- libstdc++的make_shared布局在gcc 4.x和gcc 6.x之间是否发生了变化?
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 为什么我的 int 在 C++ 程序中间发生了变化?
- 这个阶乘程序内部发生了什么?
- 一个类如何知道他的一个变量中是否发生了什么?
- 我的参考变量发生了什么
- 当我没有给变量赋新值时,为什么变量的值发生了变化?
- c++索引变量在调试版本中发生了根本性的变化
- 为什么字符串变量的sizeof()总是返回相同的数字,即使内容发生了变化
- 这个匿名类(变量)声明中到底发生了什么?
- 调用fscanf后发生了奇怪的局部变量变化