为什么 "int" 不能与 "j" 正常工作,但 long long 工作正常?

Why is "int" not working correctly with "j" but long long is working fine?

这是我的代码 int j:

void solve(){
    unsigned long long n;
    cin>>n;
    unsigned long long sum = 0;
    int j = 1;
    for(int i=3;i<n+1;i+=2){
        sum += ((4*i)-4)*(j);
        j++;
    }
    cout<<sum<<"\n";
    }
Input:
499993

Output:
6229295798864

但它给出了错误的输出,这是我的 long long j 代码,它工作正常:

void solve(){
    int n;
    cin>>n;
    unsigned long long sum = 0;
    long long j = 1;
    for(int i=3;i<n+1;i+=2){
        sum += ((4*i)-4)*(j);
        j++;
    }
    cout<<sum<<"\n";
    }
Input:
499993

Output:
41664916690999888

在这种情况下,j 的值远低于 499993,后者在 int 范围内,但仍然无法正常工作。为什么会发生这种情况?

这里是 link 到实际的 problem。万一你想看看

注意 ((4*i)-4)*(j) 的结果是一个 int,因为 ij 都是 int 类型。仅当将 ((4*i)-4)*(j) 添加到 sum 时,右侧才会提升为 unsigned long long。但是表达式 ((4*i)-4)*(j) 在被提升之前已经溢出了足够大的 int 类型的大小 n

但是,如果您将 ij 中的任何一个更改为 unsigned long long,表达式 ((4*i)-4)*(j) 将被评估为 unsigned long long,安全地在大小限制内。

在表达式的第一个代码片段中

((4*i)-4)*(j)

赋值语句

sum += ((4*i)-4)*(j);

两个操作数 (4*i)-4)(j) 的类型都是 int。所以表达式的类型(操作数的普通类型)也是int。但是 int 类型的对象不够大,无法存储结果值。所以这里就发生了溢出。

j 声明为 long long

类型时
long long j = 1;

那么上面表达式的常见类型也是long long。这意味着由于通常的算术转换,此操作数 (4*i)-4) 也被转换为类型 long long。并且这种类型的对象可以存储为输入数据提供的结果值。

您可以查看 intlong long.

类型的对象中可以存储的最大值是多少

给你。

#include <iostream>
#include <limits>

int main() 
{
    std::cout << "The maximum value of an object of the type int is "
              << std::numeric_limits<int>::max()
              << '\n';

    std::cout << "The maximum value of an object of the type long long is "
              << std::numeric_limits<long long>::max()
              << '\n';

    return 0;
}

程序输出可能看起来像

The maximum value of an object of the type int is 2147483647
The maximum value of an object of the type long long is 9223372036854775807