从 double 转换到 size_t 会产生错误的结果?

Byr*_*onB 4 c++ type-conversion c++20

以下代码有效。我的问题是,应该 2) 不会导致非常接近 1) 的结果吗?为什么 2) 投到这么小的数量?因此,也许值得注意的是 2) 正好是 1) 的一半:

std::cout << "1)  " << std::pow(2, 8 * sizeof(size_t)) << std::endl;
std::cout << "2)  " << static_cast<size_t>(std::pow(2, 8 * sizeof(size_t))) << std::endl; 
Run Code Online (Sandbox Code Playgroud)

输出是:

  1. 18446744073709551616
  2. 9223372036854775808

t.n*_*ese 11

这是由于规范的那部分:

7.3.10 浮点积分转换[conv.fpint]

浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。如果截断的值无法在目标类型中表示,则行为未定义。

该值18446744073709551616(即被截断的部分)大于std::numberic_limit<size_t>::max()您系统上的值,因此,该转换的行为未定义。

  • 对于这种情况,截断并不重要。无论是否截掉小数部分,这个数字都太大了。 (2认同)