c++ - 在计算过程中将 int 类型转换为 long long 有什么好处?

标签 c++ casting

我通过以下函数得到了错误的答案

vector<int> repeatedNumber(const vector<int> &A) {
    int n = A.size();
    long long linear_sum = 0,square_sum = 0;
    int i = 0;
    for(;i<n;i++){
        linear_sum += A[i];          //LINE 1
        square_sum += A[i]*A[i];     //LINE 2
    }
    linear_sum = linear_sum - (n*(n+1))/2;
    square_sum = square_sum - (n*(n+1)*(2*n+1))/6;
    square_sum /= linear_sum;
    vector<int> ans;
    ans.push_back((linear_sum+square_sum)/2);
    ans.push_back((-linear_sum+square_sum)/2);
    return ans;
}

但是当我将 LINE 1 和 LINE 2 替换为:

linear_sum += (long long)A[i];          
square_sum += (long long)A[i]*(long long)A[i];     

我得到了正确的答案。为什么只需将 int 类型转换为 long long 就可以解决问题。

最佳答案

当你将两个 int 相乘时values 结果计算为 int .

如果相乘后的值对于 int 来说太大了你会得到“未定义的行为”(在大多数常见的硬件中你只会得到一个看似随机的结果)。

例如33554432 (即 1<<25 == 225)对于 32 位整数是可以的,但它的平方 1125899906842624 (即 250)不是。

转换为 long long计算乘法之前的项,您希望扩大正确完成计算的范围。

这些问题在原生提供任意精度整数的语言(如 Python 或 Lisp)中不存在。

注意 int 是可能的和 long long大小确实相同(您只能确定 long long小于 int)。

关于c++ - 在计算过程中将 int 类型转换为 long long 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30630643/

相关文章:

将具有两列的data.frame reshape 为具有数据的多列(R)

c++ - 如何验证 C++ 链表中的节点是否已解除分配?

c++ - 使用 MVC 模式避免多人游戏和重播中的同步问题的提示

c++ - C++中的单元测试

c++ - 如何创建与 C++ Web 服务交互的 Silverlight 应用程序?

c++ - 为两个类之间具有循环依赖关系定义重载转换运算符

c - 在 C 中,如果定义了转换/提升规则,是否可以将原语传递给正在寻找用户定义的数据类型作为输入的函数?

c++ - 可从多个文件和函数访问的类值 c++

ios - 不访问 Objective-C 中的函数

python - 在 Python 中将字符串从 split 函数转换为 int 的有效方法