在计算过程中将int类型转换为long long的优点是什么?

What is the advantage of typecasting int to long long during calculations?

本文关键字:long 是什么 过程中 计算 int 类型转换      更新时间:2023-10-16

我得到了错误的答案下面的函数。

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;
}

但是当我将第一行和第二行替换为:

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

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

当您将两个int值相乘时,结果将计算为int

如果值相乘时太大的int你得到"未定义的行为"(在最常见的硬件,你只是得到一个看似随机的结果)。

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

在计算乘法之前将项强制转换为long long,希望可以扩大正确计算的范围。

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

请注意,intlong long确实是相同的大小(您只能确定long long不小于int)。

关键在这里:

A[i]*A[i]

这个值可能太大,溢出int,然后才转换为long long,但是。

(long long)A[i]*(long long)A[i];  

首先被转换,然后相乘,并且不能溢出long long