为什么 "int "和 "j "不能正常工作,而long long却能正常工作?

问题描述 投票:0回答:1

这是我的代码 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 范围,但还是不行。其实为什么会出现这种情况呢?

这里是实际的链接 问题. 万一,你想看看。

c++ int long-integer long-long
1个回答
3
投票

请注意 ((4*i)-4)*(j) 是一个int,因为两个 ij 是int类型。只有在添加了 ((4*i)-4)*(j)sum. 但这一表述 ((4*i)-4)*(j) 已经超出了int类型的大小,对于一个足够大的 n 晋升前。

但是,如果你改变了其中一个 ij 到unsigned long long,表达式 ((4*i)-4)*(j) 被评估为unsigned long long,安全地在大小限制内。


2
投票

在表达式中的第一段代码中,我们可以看到

((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
© www.soinside.com 2019 - 2024. All rights reserved.