C代码指数计算给出了错误的结果

C code exponential calculation is giving wrong result

对于 int 值 2,015,671 此代码输出 475,739,751

long long cube(int n)
{
return n*n*n;
}

而正确的值应该是 8,189,529,329,933,957,120 但是使用来自 pow(n, 3) 我得到了正确的结果。如果它是 long long 类型的溢出那么为什么它适用于 pow ?而且没有达到long long数据类型的MAX9,223,372,036,854,775,807。这种行为的解释是什么?

将表达式的结果转换为新类型为时已晚。

如果 n 是一个 int 那么 n*n*n 是一个只包含 int 的表达式并且 产生 int 结果(存在一些微妙的隐式转换 小于 int 的类型,但这不是这里的主要问题)。

如果这个结果溢出,那么将它放在一个更宽的整数中也无济于事 恢复丢失的信息。
您需要在 计算表达式之前 执行此转换。

long long cube(int n)
{
long long r=n;
return r*r*r;
}

(或将参数改为long long)

您必须明确地将 int 转换为 long long int。

long long cube(int n) {
  return (long long int) n*n*n;
}